Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在0可变参数上专门化可变模板类?_C++_Templates_C++11 - Fatal编程技术网

C++ 如何在0可变参数上专门化可变模板类?

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

假设我有一个类可以接受一个类型和一个varadic数量的参数:

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
(in
B
)之外,还需要出于某种原因访问所提供类的模板参数,那么您只需要整个逻辑。否则,您可以只传递完全指定的类,并填充所有参数,即
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;
}