我刚开始使用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可以获得相同的效果吗?
答案 0 :(得分:2)
你可以摆脱is_same
和query_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
是正确的。