假设我有一个类可以接受一个类型和一个varadic数量的参数:
template <typename T, typename... Args>
class B
{
T<Args...> x;
};
此类构成别名类型的基础,如下所示:
template <typename... Args>
using AliasedType = B<T, Args...>;
但是有些情况下类型T
不是模板,在这种情况下,varadic包的长度为0.但是,class B
仍会尝试声明此类型的实例一组空的模板参数,导致错误。因此,为了解决这个问题,我尝试创建一个B
的模板特化,它根本没有任何视觉参数:
template <typename T>
class B<T>
{
T x;
};
但这似乎不起作用。
为了说明工作示例中的问题:
class A
{
};
template <typename T, typename... Args>
class B
{
T<Args...> x;
};
template <typename T>
class B<T>
{
T x;
};
main() {
B<A> a;
}
输出结果为:
error: ‘T’ is not a template T<Args...> x;
为什么这不能解析为接受非模板类型的专用版本?我确定我在这里遗漏了一些非常明显的东西......似乎空的可变参数模板包没有解决为&#34;没有&#34;正如我所想的那样。
答案 0 :(得分:3)
这是一个想法。它可能不是最佳的,但它的工作原理。首先,您希望B
的第一个参数是模板模板参数(否则错误甚至会出现在有效参数中)。对于非模板类型,您可以将类型包装在模板中。这甚至适用于double
等基本类型:
template <template<typename...> class T, typename... Args>
class B
{
T<Args...> x;
};
template <typename T>
struct MakeTemplate {
template <typename...> using type = T;
};
template <typename T>
class Testclass {
T datamember;
};
main() {
B<MakeTemplate<double>::type > b1;
B<Testclass,int> b2;
}
这可以很好地编译,如您所见here。这可能是你想要的吗?这就是说我只想提一下,除了声明成员变量x
(在B
中)之外,如果由于某种原因需要访问所提供类的模板参数,则只需要整个逻辑。否则,你可以只传递填充了所有参数的完全指定的类,即B< Testclass<double> >
或B<double>
,在这种情况下,B
只需要一个模板参数,并且始终是一个类型名/类而不是模板。