【发布时间】:2021-05-16 13:31:21
【问题描述】:
我要尝试一个有趣的技巧! 我想递归地构建模板类的继承。
我期待看到这个:
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> 时,它会尝试为“父”类解压缩可变参数模板参数,但它失败了,即
ToPack<int> -> actually ToPack<int, void> that tries to unpack ToPack<void...>
这个问题能解决吗?
【问题讨论】:
-
s/T<void>/T<>? -void实际上是一个类型,而不是没有类型的占位符。它不在包中,因此扩展不会以它结束。
标签: c++ templates metaprogramming template-meta-programming