2016-05-31 19 views
6

Considerando un tipo di variante e una funzione modello, , come posso verificare che il tipo di modello sia uno dei tipi della variante? Esiste un modo più elegante del seguente?Come verificare se un tipo di modello è uno dei tipi di un tipo di variante?

typedef boost::variant<Foo,Bar> Var; 

template <typename T> 
void f(const T& x) 
{ 
    BOOST_STATIC_ASSERT(
     boost::is_same<T,Foo>::value 
    || boost::is_same<T,Bar>::value 
); 
} 

Nota: Io uso Boost 1,57 e gcc 4.8.3. Non uso C++ 11 per la compatibilità con le vecchie versioni di gcc.

+1

E 'possibile fare un 'tratti contains' (ma senza variadic da C++ 11, non sono sicuro che sia più elegante). – Jarod42

risposta

8

Uso MPL:

#include <boost/variant/variant.hpp> 
#include <boost/mpl/contains.hpp> 

typedef boost::variant<Foo,Bar> Var; 

template <typename T> 
void f(const T& x) 
{ 
    BOOST_STATIC_ASSERT(boost::mpl::contains<Var::types, T>::value); 
} 

DEMO

o manualmente iterare boost:::variant tipi:

#include <boost/variant/variant_fwd.hpp> 
#include <boost/type_traits.hpp> 

template <typename T, typename V> 
struct variant_has_type; 

template <typename T, BOOST_VARIANT_ENUM_SHIFTED_PARAMS(typename Ts)> 
struct variant_has_type<T, boost::variant<T, BOOST_VARIANT_ENUM_SHIFTED_PARAMS(Ts)> > : boost::true_type {}; 

template <typename T, typename U, BOOST_VARIANT_ENUM_SHIFTED_PARAMS(typename Ts)> 
struct variant_has_type<T, boost::variant<U, BOOST_VARIANT_ENUM_SHIFTED_PARAMS(Ts)> > : variant_has_type<T, boost::variant<BOOST_VARIANT_ENUM_SHIFTED_PARAMS(Ts), void> > {}; 

template <typename T, BOOST_VARIANT_ENUM_SHIFTED_PARAMS(typename Ts)> 
struct variant_has_type<T, boost::variant<void, BOOST_VARIANT_ENUM_SHIFTED_PARAMS(Ts)> > : boost::false_type {}; 

DEMO 2

Problemi correlati