C++17。使用“自动”处理相关的模板参数。代码排序的困难
我正在创建一个类模板,它接受两个模板参数,但它们是相关的。 一个实例是mysql数据库。模板是用MYSQL和MYSQL类型初始化的 成员函数将返回MYSQL_RES*。 如果我创建了一个带有2个参数的模板,这会很好地工作 乙二醇 但是由于类是相关的,当指定类型T时,类型R是已知的。有没有办法去 编码这个 使用自动,我可以让这个工作C++17。使用“自动”处理相关的模板参数。代码排序的困难,c++,templates,auto,C++,Templates,Auto,我正在创建一个类模板,它接受两个模板参数,但它们是相关的。 一个实例是mysql数据库。模板是用MYSQL和MYSQL类型初始化的 成员函数将返回MYSQL_RES*。 如果我创建了一个带有2个参数的模板,这会很好地工作 乙二醇 但是由于类是相关的,当指定类型T时,类型R是已知的。有没有办法去 编码这个 使用自动,我可以让这个工作 template<class T> class foo{ public: auto bar(); }; 具有给定的成员函数专业化 template&
template<class T> class foo{
public:
auto bar();
};
具有给定的成员函数专业化
template<> auto foo<MYSQL>::bar(){MYSQL_RES *r;return r;};
但随后在代码排序方面遇到了问题。ie模板自动foo::bar
必须在使用前实施,而不是在单独的cpp文件中
我已经试着做了一个前瞻性声明
乙二醇
但这不起作用
有人有优雅的方法来解决这个问题吗
谢谢。您可以创建trait来帮助您:
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...
这不起作用意味着什么?你得到了什么错误?当你说R型已知时,你有权访问它吗?您能像这样在MYSQL实现中公开它吗?类MYSQL{public:usingrestype=MYSQL_RES;};然后您可以使用T::RESTYPE bar;如您所说,如果已知类型R,则它不必成为模板参数。该模板可以简单地派生出它应该是什么,也许可以使用前向声明。非常感谢。必须使用R=myFooTrait::type进行更改;to R=typename myFooTrait::type。现在谷歌搜索traits,看看它们是如何work@metelko如果能帮助你解决问题,请考虑接受答案。
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...