Boost.Variant 型かのチェック

is_variant 的な。

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

template<typename T>
struct is_variant : boost::mpl::false_{};

template<BOOST_VARIANT_ENUM_PARAMS(typename T)>
struct is_variant<boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> >
    : boost::mpl::true_{};


#include <boost/mpl/assert.hpp>

BOOST_MPL_ASSERT((
    is_variant<boost::variant<int, float, char> >
));

BOOST_MPL_ASSERT((
    is_variant<boost::variant<int, boost::variant<int, float> > >
));

BOOST_MPL_ASSERT_NOT((
    is_variant<void*>
));

BOOST_MPL_ASSERT_NOT((
    is_variant<int>
));

BOOST_MPL_ASSERT((
    is_variant<boost::variant<> >
));

int main(){}

ideone からのコピペプログラミング。
思ったよりもすっきりしている。


[boost]
ver 1.46.1
[参照]
http://ideone.com/BGh58h