我刚刚开始使用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,是否有可能获得相同的效果?

最佳答案

您可以摆脱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是正确的选择。

关于c++ - 正确使用boost::mpl::包含和static_assert,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20153093/

10-14 20:55
查看更多