可变参数模板和类型特征

9

我目前有一个可变参数函数,它接受任意数量和任意类型的参数(显然),但是我想将类型限制为仅为POD类型,并且大小与void*相同或更小。

对于void*的检查很容易,我只需要这样做:

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

然而,我不知道如何对std::is_pod进行相同的操作。

这个可行吗?


3
sizeof...(Args) 可能不是你想要的结果,它返回参数包中有多少个参数(而不是它们的大小)。如果你想限制它们的大小,可以尝试做类似于 static const bool value = sizeof(Head) <= sizeof(void*) && ... 的操作,详情请见此链接 - Vitus
1个回答

12

你可以编写一个元函数来确定是否都是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;
};
那么。
static_assert( all_pod<Args...>::value, "All types must be POD" );

在GCC 4.6下,这个程序会给我返回以下错误(已剪裁以提供相关部分):“模板参数列表中的第1个参数类型/值不匹配”“期望一个类型,而得到了'Args ...'” - RaptorFactor
没关系,我是个白痴。我传递的是值而不是类型。傻啊。 - RaptorFactor
Args...为空时不起作用。最好使用:template <> struct all_pod <> { static const bool value = true; };而不是template <typename T> struct all_pod <T> { static const bool value = std :: is_pod <T> :: value; }; - Mikhail Pilin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接