正确使用boost :: mpl :: contains和static_assert

时间:2013-11-22 19:35:24

标签: c++ boost-mpl

我刚开始使用boost :: variant而且我遇到了一种情况,我想确保模板参数只是变体中允许的类型之一。在阅读boost文档之后,似乎static_assert,boost :: variant :: types和boost :: mpl :: contains的组合应该完全符合我的要求。我已经设法找到一个解决方案,但它看起来相当冗长,我想知道是否有更好的方法来做到这一点。无论如何,我的解决方案是:

typedef boost::variant<int, double, std::string> my_variant;

template<typename T>
void Func()
{
    typedef boost::mpl::contains<my_variant::types, T>::type query_t;
    typedef boost::mpl::bool_<true>::type query_result_t;

    static_assert(boost::is_same<query_t, query_result_t>::value, "T isn't a valid my_variant type.");

    // ...
}

没有boost :: mpl :: bool_和/或boost :: is_same可以获得相同的效果吗?

1 个答案:

答案 0 :(得分:2)

你可以摆脱is_samequery_result_t,因为contains会返回一个MPL积分常数:

typedef boost::variant<int, double, std::string> my_variant;

template<typename T>
void Func()
{
    static_assert(boost::mpl::contains<my_variant::types, T>::type::value, "T isn't a valid my_variant type.");

    // ...
}

我相信这是简洁的 - 你需要一些谓词来查询类型序列,boost::mpl::contains是正确的。