如何从自身递归继承模板class? (不是 CRTP!)
How to recursively inherit a template class from itself? (not CRTP!)
我要尝试一个有趣的把戏!
我想递归地构建模板的继承 classes.
我期待看到这个:
T<int, int, int> inherits T<int,int> inherits T<int> inherits T<void>
/*Here should be specializations with void...*/
template<typename T, typename... Ts>
class ToPack : ToPack<Ts...>
{
public:
ToPack(T t, Ts... ts) : ToPack(ts...) {}
};
template<typename T>
class ToPack<T, void> {};
int main(void)
{
ToPack<int, int, int> t(1, 2, 3);
}
但问题在于,当编译器尝试实例化 T<int>
时,它会尝试为“parent”class 解压可变模板参数,但失败了,即
ToPack<int> -> actually ToPack<int, void> that tries to unpack ToPack<void...>
这个问题可以解决吗?
如评论中所述,void
本身就是一种类型,而不是空的占位符。你真正拥有的是 ToPack<int, int, int>
-> ToPack<int, int>
-> ToPack<int>
-> ToPack<>
。 ToPack<>
无效,因为它至少需要一个模板参数,因此无法编译。
您需要通过专注于一个模板参数来更改您的基本情况:
template <typename T, typename... Ts>
class ToPack : ToPack<Ts...> {
public:
ToPack(T t, Ts... ts) : ToPack<Ts...>(ts...) {}
};
template <typename T>
class ToPack<T> {
public:
ToPack(T t) {}
};
我要尝试一个有趣的把戏! 我想递归地构建模板的继承 classes.
我期待看到这个:
T<int, int, int> inherits T<int,int> inherits T<int> inherits T<void>
/*Here should be specializations with void...*/
template<typename T, typename... Ts>
class ToPack : ToPack<Ts...>
{
public:
ToPack(T t, Ts... ts) : ToPack(ts...) {}
};
template<typename T>
class ToPack<T, void> {};
int main(void)
{
ToPack<int, int, int> t(1, 2, 3);
}
但问题在于,当编译器尝试实例化 T<int>
时,它会尝试为“parent”class 解压可变模板参数,但失败了,即
ToPack<int> -> actually ToPack<int, void> that tries to unpack ToPack<void...>
这个问题可以解决吗?
如评论中所述,void
本身就是一种类型,而不是空的占位符。你真正拥有的是 ToPack<int, int, int>
-> ToPack<int, int>
-> ToPack<int>
-> ToPack<>
。 ToPack<>
无效,因为它至少需要一个模板参数,因此无法编译。
您需要通过专注于一个模板参数来更改您的基本情况:
template <typename T, typename... Ts>
class ToPack : ToPack<Ts...> {
public:
ToPack(T t, Ts... ts) : ToPack<Ts...>(ts...) {}
};
template <typename T>
class ToPack<T> {
public:
ToPack(T t) {}
};