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

标签 c++ templates c++11

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

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;

Live example here

为什么不解析为接受非模板类型的专用版本?我确定我在这里遗漏了一些非常明显的东西......似乎一个空的可变参数模板包没有像我想象的那样被解析为“无”。

最佳答案

这是一个想法。它可能不是最佳的,但它有效。首先,您需要第一个参数 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只需要一个模板参数,它总是类型名/类而不是模板。

关于c++ - 如何在 0 个可变参数上专门化可变参数模板类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26171181/

相关文章:

c++ - 非静态数据成员的 thread_local 数据,再一次

c++ - 围绕变量 `f` 尝试计算斐波那契 (n) 的堆栈损坏

c++ - 是否可以使用 SFINAE 检测类方法的常量性?

c++ - 如何在不同的 dll 中强制销毁静态对象的顺序?

android - 堆栈有多大,我用了多少?

c++ - 类模板的成员函数返回该类中定义的类型的正确语法是什么?

templates - 如何使用 Go 将多个字符串解析为一个模板?

c++ - 如何获取整数参数包中的第i个整数?

c++ - Visual Studio 2015 错误 C4996 'std::_Copy_impl' : Function call with parameters that may be unsafe

multithreading - 为什么这个小的 c++11 多线程程序会出现段错误