2016-05-31 1 views
6

Учитывая тип варианта и функцию шаблона, Как проверить тип шаблона - один из вариантов варианта? Есть ли более элегантный способ, чем следующий?Как проверить, является ли тип шаблона одним из типов типа варианта?

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

Примечание: Я использую Повысьте 1.57 и GCC 4.8.3. Я не использую C++ 11 для совместимости со старыми версиями gcc.

+1

Вы можете сделать черты 'contains' (но без VARIADIC от C++ 11, не уверен, что он более изящный). – Jarod42

ответ

8

Использование 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

или вручную перебрать boost:::variant типов:

#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

Смежные вопросы