2013-06-05 5 views
2

Как сделать следующее в C++:Как изменить значение на основе параметра шаблона?

template <typename T> 
void Foo(T t) 
{ 
    ... 
    call Bar(true) if T is of some specific type U or V 
    call Bar(false) otherwise 
    ... 
} 


void Bar(bool b) 
{ 
    ... 
} 

Я мог бы добавить избыточный параметр шаблона, но было бы хорошо ..., избыточны.

Я мог бы также попытаться сделать Bar функцией шаблона и специализироваться на U и V, но это не мой код, и проблема, вероятно, просто распространяется.

я мог бы создать функцию CallBar, что не делает ничего, кроме как позвонить Bar(false) и специализироваться его называют Bar(true) для U и V. Но пример на самом деле немного упрощена здесь. Логическое значение используется во многих местах в FooLogger иногда при вызове функций (поэтому есть несколько Bar s) иногда даже в?: Условностях.

Что для вас лучше всего?

ответ

10

идиоматическое решение было бы использовать черты:

template <typename T> 
struct BarTraits { 
    static const bool value = false; 
}; 

template <> 
struct BarTraits<U> { 
    static const bool value = true; 
}; 

template <> 
struct BarTraits<V> { 
    static const bool value = true; 
}; 

template <typename T> 
void Foo(T t) 
{ 
    ... 
    Bar(BarTraits<T>::value); 
    ... 
} 
5

Возможное решение с использованием std::is_same:

template <typename T> 
void Foo(T t) 
{ 
    Bar(std::is_same<T, int>::value || std::is_same<T, char>::value); 
} 
+0

он также может использовать шаблон специализации? –

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