在模板函数中具有特定类型的不同行为

时间:2013-11-20 22:57:35

标签: c++ templates

我正在开发一个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;
    }

1 个答案:

答案 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>应启用一个或另一个实现。