2015-07-21 3 views
9

Джонатан Wakely-х answer на вопрос Type trait to check that all types in a parameter pack are copy constructible дает простой (МОГ) способ проверить, если все переменные расширенных в параметре пакета одного и того же типа - например:Проверьте параметр обновления для всех типов T

#include <type_traits> 

namespace detail { 
    enum class enabler {}; 
} 

template <bool Condition> 
using EnableIf = 
    typename std::enable_if<Condition, detail::enabler>::type; 

template<typename... Conds> 
struct and_ : std::true_type {}; 

template<typename Cond, typename... Conds> 
struct and_<Cond, Conds...> 
     : std::conditional<Cond::value, and_<Conds...>, 
     std::false_type>::type {}; 

template<typename... T> 
using areInts = and_<std::is_same<T,int>...>; 

template<typename... T> 
using areMySpecificClass = and_<std::is_same<T,MySpecificClass>...>; 

Я не могу решить, как это расширить, написать шаблон, например areTypeT.

Мои первые попытки наткнулись на «Пакет параметров« T »должен быть в конце списка параметров шаблона». Моя недавняя попытка компиляции, но если я ее использую, то я получаю сбои замещения:

template<typename Target> 
template<typename... T1> 
using areT = and_<std::is_same<T1,Target>...>; 

Как это сделать?

ответ

4

Ваш синтаксис только прочь немного, вам не нужны две отдельные декларации шаблона, что синтаксис для определения шаблонов членов вне класса:

template<typename Target, typename... Ts> 
using areT = and_<std::is_same<Ts,Target>...>; 

static_assert(areT<int,int,int,int>::value,"wat"); 
static_assert(!areT<int,float,int,int>::value,"wat"); 

Demo

2

Просто это

template<typename Type, typename... T> 
using areTypeT = and_<std::is_same<T, Type>...>; 
Смежные вопросы