2010-06-09 3 views
5

Я уверен, что у boost есть некоторые функции для этого, но я не знаю соответствующих библиотек достаточно хорошо. У меня есть класс шаблонов, который довольно простой, за исключением одного поворота, где мне нужно определить условный тип. Вот код psuedo для чего я хочуОпределения условного типа

struct PlaceHolder {}; 
    template <typename T> 
class C{ 
    typedef (T == PlaceHolder ? void : T) usefulType; 
}; 

Как написать такой тип условного?

+0

Интересно. При каких обстоятельствах это будет полезно? Можете привести пример. – Stephen

+0

Вот мой пример. Для одного аргумента шаблона, скажем, TYPE, имеющего значение PlaceHolder, означает «отключить некоторую функцию». Существует множество обратных вызовов с типом возвращаемого типа TYPE *, что естественным значением отключения функции является то, что обратные вызовы имеют тип возвращаемого типа void. usefulType - это возвращаемое значение для обратных вызовов. –

+0

@pythonicmetaphor не могли бы вы изменить принятый ответ? Сейчас разные времена. – Ven

ответ

8

Также с новым стандартом:

typedef typename std::conditional<std::is_same<T, PlaceHolder>::value, void, T>::type usefulType

+1

Это должен быть принятый asnwer. –

2
template < typename T > 
struct my_mfun : boost::mpl::if_ 
< 
    boost::is_same<T,PlaceHolder> 
, void 
, T 
> {}; 

template < typename T > 
struct C { typedef typename my_mfun<T>::type usefulType; }; 
+0

Код должен иметь префикс 4 пробела. Вы можете выбрать текст и нажать кнопку 101010, чтобы сделать это навалом. – GManNickG

+0

Спасибо, но, пожалуйста, не изменяйте мои ответы. –

+7

См. Часто задаваемые вопросы: «Если вам не нравится идея ваших вопросов и ответов, которые редактируются другими доверенными пользователями, это может быть не для вас». – Bill

6

Я думаю, что это принцип вы после:

template< class T > 
struct DefineMyTpe 
{ 
    typedef T usefulType; 
}; 

template<> 
struct DefineMyType<PlaceHolder> 
{ 
    typedef void usefulType; 
}; 

template< class T > 
class C 
{ 
    typedef typename DefineMyType<T>::usefulType usefulType; 
}; 
+1

Это не должно быть принятым ответом в 2015 году. – Ven

+1

Этого не должно быть, но я не могу его изменить .. Просто переверните его, используя std :: условный, любой SO-пользователь, вероятно, будет достаточно умным, чтобы рассмотреть самый верный ответ. – stijn

+1

Пожалуйста, добавьте «см. Более поздний ответ от @rafak» или что-то в этом роде, чтобы люди знали, чтобы посмотреть вверх. – Ven

Смежные вопросы