2013-11-20 5 views
1

Я работаю над функцией logHelper. Я перегрузил оператор < <, и я записываю значение в объект-объект. Как мне обрабатывать случай для специализированного поведения для классов, полученных из одного и того же базового класса.Поведение разных типов для определенного типа в функции шаблона

Чтобы быть более конкретным, я хочу добавить строку, возвращаемую функцией() для исключения.

template <class T> 
    LogStream& operator<<(const T& t) 
    { 
     if (std::is_base_of<std::exception, T>::value) 
     { 
      std::exception exception = std::dynamic_cast<std::exception>(t); 
      m_output << exception.what(); 
     } 
     else 
     { 
      m_output << t; 
     } 
     return *this; 
    } 
+0

Возможно, вы захотите использовать «полиморфизм» Google. –

+1

@ H2CO3: За исключением того, что _polymorphism_ на самом деле не помогает, если вы не нашли способ исправления перегрузки оператора вывода для 'std :: exception', подчиняющегося правилу, чтобы перегрузить операторы только в том случае, если они включают, по крайней мере, определенного типа. –

+0

@ DietmarKühl Я не следую. OP хочет делать разные вещи на основе того, был ли объект получен из определенного базового класса. Конечно, вы можете написать if-else или switch-case, но тогда это C, а не C++. Такое повторное использование кода требует полиморфизма на объектно-ориентированном языке. Синтаксис является вторичным; с соответствующим рефакторингом это легко сделать. –

ответ

2

Если вы хотите иметь различный код в зависимости от аргумента шаблона, вам нужно как-то обеспечить совершенно отдельное определение, выбранное в подходящий момент типа. Например, вы могли бы использовать

template <class T> 
typename std::enable_if<std::is_base_of<std::exception, T>::value, LogStream>::type& 
operator<<(const T& t) 
{ 
    m_output << t.what(); 
    return *this; 
} 

template <class T> 
typename std::enable_if<!std::is_base_of<std::exception, T>::value, LogStream>::type& 
operator<<(const T& t) 
{ 
    m_output << t; 
    return *this; 
} 

Использование std::enable_if<condition, T> с отрицаниями условий должны включить один или другую реализацию.

+0

удивительный Дитмар. Он работает. и теперь я знаю std :: enable_if check. – prasadrahul

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