Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++17。使用“自动”处理相关的模板参数。代码排序的困难_C++_Templates_Auto - Fatal编程技术网

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

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&

我正在创建一个类模板,它接受两个模板参数,但它们是相关的。 一个实例是mysql数据库。模板是用MYSQL和MYSQL类型初始化的 成员函数将返回MYSQL_RES*。 如果我创建了一个带有2个参数的模板,这会很好地工作 乙二醇

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

使用自动,我可以让这个工作

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...