C++17。使用 auto 处理相关的模板参数。代码排序的困难

C++17. Dealing with template parameters that are related using auto . Difficulties with code ordering

我正在创建一个 class 模板,该模板采用 2 个相关的模板参数。 一个实例将用于 mysql 数据库。模板初始化为类型 MYSQL 和 成员函数将 return MYSQL_RES *。 如果我创建一个带有 2 个参数的模板,这会很好地工作 例如

template<class T,class R> class foo

但由于 classes 是相关的,当指定类型 T 时,类型 R 是已知的。有什么办法 编码这个?

使用自动我可以让它工作,例如

template<class T> class foo{
 public:
auto bar();
};

成员函数专门化,如

 template<> auto foo<MYSQL>::bar(){MYSQL_RES *r;return r;};

但随后 运行 遇到代码排序问题。即模板<>自动foo::bar 必须在使用前实现,而不是在单独的 cpp 文件中。

我试过做前向声明 例如

template<> auto foo<MYSQL_RES>::bar();

但这行不通。

有没有人有解决这个问题的优雅方法?

谢谢。

您可以创建特质来帮助您:

template<class T> struct myFooTrait;

template<class T> class foo
{
public:
    using R = typename myFooTrait<T>::type;
    R bar();
};

class MYSQL;
class MYSQL_RES;

template<> struct myFooTrait<MYSQL>
{
    using type = MYSQL_RES *;
};

template<>
auto foo<MYSQL>::bar() -> R { MYSQL_RES *r = /*..*/;return r;}

// Other specializations...