#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; };