2016-05-31 34 views
6

Bir varyant türü ve bir şablon işlevi göz önüne alındığında, Şablon türünün varyantın türlerinden biri olup olmadığını nasıl kontrol edebilirim? Aşağıdakilerden daha şık bir yolu var mı?Bir şablon türünün varyant türünden biri olup olmadığı nasıl kontrol edilir?

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

Not: Ben 1.57 ve gcc 4.8.3 Boost kullanın. Eski gcc sürümleriyle uyumluluk için C++ 11 kullanmayın.

+1

Sen (ancak variadic olmadan bir özellikleri 'contains' yapabilir C++ 11, daha zarif olduğundan emin değilsiniz. – Jarod42

cevap

8

Kullanım 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

veya el boost:::variant türleri üzerinde yineleme:

#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