C ++ Boost вариант вопроса - PullRequest
       24

C ++ Boost вариант вопроса

4 голосов
/ 24 сентября 2010

Я знаю, что 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 Ответ

7 голосов
/ 24 сентября 2010

Это действительно возможно, 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 , если вам потребуется еще несколько алгоритмов.

...