C ++提升变体问题

时间:2010-09-24 18:55:49

标签: c++ boost variant compile-time boost-mpl

我知道boost::variant使用boost::mpl背后的东西,并且有一个mpl兼容的typedef types

假设我有一个简单的typedef:typedef boost::variant<bool, int> Variant;

现在我有另一个模板功能,让我们说:

template <typename T> T function() {
   // ...
}

我希望此功能在两种情况下采取不同的行动:T Variant::types的一部分,而不是template <typename T> typename boost::enable_if<CONDITION, T>::type function() { // Implementation for the case T is in Variant::types } template <typename T> typename boost::disable_if<CONDITION, T>::type function() { // Implementation for the case T is ***NOT*** in Variant::types }

显然,我必须做一些像

这样的事情
CONDITION

我唯一不知道的是T

现在 - 如果Variant::types是{{1}}的一部分,我认为可以进行编译时查询。

有人知道怎么做?

1 个答案:

答案 0 :(得分:7)

确实有可能,Variant::types符合Mpl.Sequence类型的要求,因此可以像任何序列一样查询。

因此,请使用here中的boost::mpl::contains

// using C++0x syntax to demonstrate what CONDITION should be replaced with
template <typename T>
using Condition = boost::mpl::contains<Variant::types,T>

当你知道它时,没什么比这更简单了;)

如果您需要更多算法,则可以HTML格式提供完整的MPL手册。