Переменные шаблоны и признаки типа

#c #c 11 #typetraits #variadic-templates

#c #c 11 #признаки типов #переменные-шаблоны

Вопрос:

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

Проверка void * была простой, я просто сделал это:

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

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

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

Комментарии:

1. sizeof...(Args) вероятно, не делает того, что вы намереваетесь — он возвращает количество аргументов в пакете аргументов (а не их размеры). Посмотрите на это . Если вы хотите ограничить их размер, static const bool value = sizeof(Head) <= sizeof(void*) amp;amp; ... это помогло бы сделать что-то подобное, смотрите на это.

Ответ №1:

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

Комментарии:

1. В GCC 4.6 это выдает мне следующую ошибку (сокращенную, чтобы указать соответствующие части): «несоответствие типа / значения в аргументе 1 в списке параметров шаблона», «ожидаемый тип, получил ‘Args …'»

2. Неважно, я идиот. Я передавал значения, а не типы. Дух.

3. Не работает, когда 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; };