Вариадические шаблоны и черты типа - PullRequest
9 голосов
/ 05 июня 2011

В настоящее время у меня есть функция с переменным числом аргументов, которая принимает произвольное количество аргументов произвольных типов (duh), однако я хочу ограничить типы только типами POD, а также тем же размером или меньшим, чем у void *.

Проверить пустоту было легко, я просто сделал это:

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

Однако я не могу понять, как сделать то же самое для std :: is_pod.

Возможно ли это сделать?

1 Ответ

12 голосов
/ 05 июня 2011

Вы можете написать мета-функцию, чтобы определить, являются ли все типы 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" );
...