Я работаю над функцией 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;
}
Возможно, вы захотите использовать «полиморфизм» Google. –
@ H2CO3: За исключением того, что _polymorphism_ на самом деле не помогает, если вы не нашли способ исправления перегрузки оператора вывода для 'std :: exception', подчиняющегося правилу, чтобы перегрузить операторы только в том случае, если они включают, по крайней мере, определенного типа. –
@ DietmarKühl Я не следую. OP хочет делать разные вещи на основе того, был ли объект получен из определенного базового класса. Конечно, вы можете написать if-else или switch-case, но тогда это C, а не C++. Такое повторное использование кода требует полиморфизма на объектно-ориентированном языке. Синтаксис является вторичным; с соответствующим рефакторингом это легко сделать. –