C++ 可变模板与类型特征

C++ 可变模板与类型特征,c++,c++11,typetraits,variadic-templates,C++,C++11,Typetraits,Variadic Templates,我现在有一个变量函数,它接受任意数量的任意类型的参数(duh),但是,我想将这些类型限制为仅为POD的类型,并且大小与void*相同或更小 空白*检查很简单,我只是这样做: static_assert(sizeof...(Args) <= sizeof(PVOID), "Size of types must be <= memsize."); static\u assert(sizeof…(Args)您可以编写一个元函数来确定是否所有类型都是POD: template <ty

我现在有一个变量函数,它接受任意数量的任意类型的参数(duh),但是,我想将这些类型限制为仅为POD的类型,并且大小与void*相同或更小

空白*检查很简单,我只是这样做:

static_assert(sizeof...(Args) <= sizeof(PVOID), "Size of types must be <= memsize.");

static\u assert(sizeof…(Args)您可以编写一个元函数来确定是否所有类型都是POD:

template <typename... Ts>
struct all_pod;

template <typename Head, typename... Tail>
struct all_pod<Head, Tail...>
{
    static const bool value = std::is_pod<Head>::value && all_pod<Tail...>::value;
};

template <typename T>
struct all_pod<T>
{
    static const bool value = std::is_pod<T>::value;
};
模板
构造所有的_pod;
模板
结构所有组件
{
静态常量bool value=std::is_pod::value&&all_pod::value;
};
模板
结构所有组件
{
静态常量布尔值=std::is_pod::value;
};
然后

static_assert(all_pod::value,“所有类型都必须是pod”);

在GCC 4.6下,这给了我以下错误(截取以给出相关部分):“模板参数列表中参数1的类型/值不匹配”“需要类型,得到了“Args…”没关系,我是个白痴。我传递的是值而不是类型。Duh.在
Args…
为空时不起作用。最好使用:
template struct all_pod{static const bool value=true;};
而不是
template struct all_pod{static const bool value=std::is_pod::value;};
sizeof…(Args)
可能没有达到您的目的-它返回参数包中有多少个参数(而不是它们的大小)。请参阅。如果要限制它们的大小,请执行类似于
static const bool value=sizeof(Head)的操作
static_assert( all_pod<Args...>::value, "All types must be POD" );