4

私はそれがその背後にあるものをboost::variant使用しboost::mpl、mpl互換のtypedefを持っていることを知っていますtypes

単純なtypedefがあるとしましょう:typedef boost::variant<bool, int> Variant;

今、私は別のテンプレート関数を持っています、例えば:

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

Tこの関数は、一部の場合とそうでない場合の2つの場合で異なる動作をするようにし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

誰かが方法を知っていますか?

4

1 に答える 1

7

それは確かに可能でVariant::typesあり、Mpl.Sequenceタイプの要件を満たしているため、他のシーケンスと同様にクエリを実行できます。

したがって、ここから使用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>

あなたがそれについて知っているとき、これ以上簡単なことはありません;)

さらにアルゴリズムが必要な場合は、完全なMPLマニュアルをHTML形式で入手できます。

于 2010-09-24T19:26:23.167 に答える