C++ 如何在0可变参数上专门化可变模板类?
假设我有一个类可以接受一个类型和一个varadic数量的参数:C++ 如何在0可变参数上专门化可变模板类?,c++,templates,c++11,C++,Templates,C++11,假设我有一个类可以接受一个类型和一个varadic数量的参数: template <typename T, typename... Args> class B { T<Args...> x; }; 但这似乎不起作用 要在工作示例中说明此问题,请执行以下操作: class A { }; template <typename T, typename... Args> class B { T<Args...> x; }; templ
template <typename T, typename... Args>
class B
{
T<Args...> 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;
}
A类
{
};
模板
B类
{
T
为什么不将其解析为接受非模板类型的专用版本?我确信我在这里遗漏了一些非常明显的东西…似乎空的可变模板包没有解析为“无”正如我所想。这里有一个想法。它可能不是最优的,但它是有效的。首先,您希望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;
}
模板
B类
{
这可能是您想要的吗?也就是说,我只想提到,如果您除了声明成员变量x
(inB
)之外,还需要出于某种原因访问所提供类的模板参数,那么您只需要整个逻辑。否则,您可以只传递完全指定的类,并填充所有参数,即B
或B
,在这种情况下B
只需要一个模板参数,并且该参数始终是typename/class而不是模板。您的代码编写时没有任何意义。如果T
是一个类型,则无法我们没有T
@KerrekSB很好的观点..显然有些代码可以使用模板参数编写,但我完全不清楚您试图实现什么,或者为什么。甚至模板参数也无法解决这个问题,因为您无法用非模板专门化模板模板模板。typename T
a总是指定一个类型,所以即使你传入一个模板,它仍然不起作用。你不能用专门化来解决这个问题,因为你不能用模板专门化一个类型。
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;
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;
}