可变参数模板递归构造函数问题
Variadic template recursive constructor problems
我试图理解递归构造函数与可变参数模板的使用。
在下面的代码中,我想实现一个具有可变参数传递值的递归构造函数。
template <class T, class... T2>
struct Tuple{
T value;
Tuple(T n){ //constructor if only one value left
value = n;
}
Tuple(T n, T2... re){ //constructor if more than one value left
T value = n;
//Tuple(rest...); doesnt work for me
}
};
int main(){
Tuple<int, float, int> t(2, 1.2, 9);
std::cout << t.value << "\n"; //2
std::cout << t.rest.value << "\n"; //1.2
std::cout << t.rest.rest.value << "\n"; //9
}
您还必须继承自 Tuple<T2...>
template <class T, class... T2>
struct Tuple : public Tuple<T2...>
并在初始化列表中初始化继承的class(在value
之前)[注意代码未测试]
Tuple(T n, T2... re) : Tuple<T2...>{re...}, value{n}
{ }
您还需要基础案例专业化来停止递归
有点像
template <class T>
struct Tuple<T>
{
T value;
Tuple (T n) : value{n}
{ }
};
或者也(可能更简单)
template <>
struct Tuple<>
{ };
但是对于第二种解决方案,您必须将 Tuple
定义为接收零个或多个类型;可能如下
template <typename...>
struct Tuple
{ };
template <class T, class... T2>
struct Tuple<T, T2...> : public Tuple<T2...>
{
// ...
};
这样,当Tuple
收到至少一种类型时,选择专精;当收到零类型时,只有主版本匹配并作为基础案例。
我试图理解递归构造函数与可变参数模板的使用。
在下面的代码中,我想实现一个具有可变参数传递值的递归构造函数。
template <class T, class... T2>
struct Tuple{
T value;
Tuple(T n){ //constructor if only one value left
value = n;
}
Tuple(T n, T2... re){ //constructor if more than one value left
T value = n;
//Tuple(rest...); doesnt work for me
}
};
int main(){
Tuple<int, float, int> t(2, 1.2, 9);
std::cout << t.value << "\n"; //2
std::cout << t.rest.value << "\n"; //1.2
std::cout << t.rest.rest.value << "\n"; //9
}
您还必须继承自 Tuple<T2...>
template <class T, class... T2>
struct Tuple : public Tuple<T2...>
并在初始化列表中初始化继承的class(在value
之前)[注意代码未测试]
Tuple(T n, T2... re) : Tuple<T2...>{re...}, value{n}
{ }
您还需要基础案例专业化来停止递归
有点像
template <class T>
struct Tuple<T>
{
T value;
Tuple (T n) : value{n}
{ }
};
或者也(可能更简单)
template <>
struct Tuple<>
{ };
但是对于第二种解决方案,您必须将 Tuple
定义为接收零个或多个类型;可能如下
template <typename...>
struct Tuple
{ };
template <class T, class... T2>
struct Tuple<T, T2...> : public Tuple<T2...>
{
// ...
};
这样,当Tuple
收到至少一种类型时,选择专精;当收到零类型时,只有主版本匹配并作为基础案例。