2010-09-24 7 views
4

Я знаю, что boost::variant использует boost::mpl материал позади него и имеет mpl-совместимый typedef types.C++ boost вариант вопрос

Скажем, у меня есть простой ЬурейеЕ: 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.

Кто-нибудь знает как?

ответ

7

Возможно, Variant::types отвечает требованиям типа Mpl.Sequence и поэтому может быть запрошен как любая последовательность.

Поэтому, используя boost::mpl::contains из here:

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

+0

+1. Поскольку вопрос отмечен как C++, а не C++ 0x, вы можете добавить комментарий о синтаксисе 'using'. Кроме того, вы не хотели писать 'Variant :: types' вместо' Variant' в 'boost :: mpl :: contains'? – sellibitze

+0

@sellibitze: спасибо за тщательный анализ кода :-) –