2015-07-21 12 views
9

Jonathan Wakely di answer alla domanda Type trait to check that all types in a parameter pack are copy constructible fornisce un modo semplice (ish) per verificare se tutte le variabili espanse in una confezione parametri sono dello stesso tipo - ad esempio:Controllare un parametro pack per tutti di tipo 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>...>; 

Non riesco a capire come estendere questo, per scrivere un modello come areTypeT, per esempio.

I miei primi tentativi sono incappati in "Il pacchetto di parametri 'T' deve essere alla fine dell'elenco dei parametri del modello". Il mio tentativo più recente, compila, ma se lo uso tanto sono fallimenti di sostituzione:

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

Come posso fare questo lavoro?

risposta

4

tua sintassi è appena fuori un po ', non hai bisogno di due dichiarazioni di modelli separati, che la sintassi è per definire modelli di membro out-of-class:

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

Proprio questo

template<typename Type, typename... T> 
using areTypeT = and_<std::is_same<T, Type>...>; 
Problemi correlati