我目前有一个可变参数函数,它接受任意数量和任意类型的参数(显然),但是我想将类型限制为仅为POD类型,并且大小与void*相同或更小。
对于void*的检查很容易,我只需要这样做:
static_assert(sizeof...(Args) <= sizeof(PVOID), "Size of types must be <= memsize.");
然而,我不知道如何对std::is_pod进行相同的操作。
这个可行吗?
我目前有一个可变参数函数,它接受任意数量和任意类型的参数(显然),但是我想将类型限制为仅为POD类型,并且大小与void*相同或更小。
对于void*的检查很容易,我只需要这样做:
static_assert(sizeof...(Args) <= sizeof(PVOID), "Size of types must be <= memsize.");
然而,我不知道如何对std::is_pod进行相同的操作。
这个可行吗?
你可以编写一个元函数来确定是否都是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" );
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
sizeof...(Args)
可能不是你想要的结果,它返回参数包中有多少个参数(而不是它们的大小)。如果你想限制它们的大小,可以尝试做类似于static const bool value = sizeof(Head) <= sizeof(void*) && ...
的操作,详情请见此链接。 - Vitus