我正在开发一个logHelper函数。我重载了<<运算符,我将值写入ostream目标。如何处理从同一基类派生的类的特殊行为的情况。
更具体地说,我想添加what()返回的字符串作为异常。
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 :(得分:3)
如果您希望根据模板参数使用不同的代码,则需要以某种方式提供在类型的适当位置选择的完全独立的定义。例如,您可以使用
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>
应启用一个或另一个实现。