Вопрос о повышении C ++

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

Кто-нибудь знает, как это сделать?


person Yippie-Ki-Yay    schedule 24.09.2010    source источник


Ответы (1)


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

person Matthieu M.    schedule 24.09.2010
comment
+1. Поскольку вопрос помечен как C++, а не C++0x, вы можете добавить комментарий о синтаксисе using. Кроме того, разве вы не хотели написать Variant::types вместо Variant в boost::mpl::contains ? - person sellibitze; 24.09.2010