【问题标题】:Correct use of boost::mpl::contains and static_assert正确使用 boost::mpl::contains 和 static_assert
【发布时间】:2013-11-22 19:35:23
【问题描述】:

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

【问题讨论】:

    标签: c++ boost-mpl


    【解决方案1】:

    你可以去掉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.");
    
        // ...
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-14
      • 1970-01-01
      相关资源
      最近更新 更多