记录器库中POD类型的c++模板专门化
C++ template specialization for POD types in logger library
我正在滚动我自己的日志库。这个想法是有一个接口类,必须从它派生,以便对象能够从中记录日志。
class LoggedType
{
public:
virtual std::ostream &log (std::ostream &) const = 0;
};
Log类将实现operator<<对于LoggedType使用log方法。对于其他所有内容,将使用常规操作符<<:
typedef std::basic_ostream<char, std::char_traits<char> > CoutType;
typedef CoutType &(*StandardEndLine)(CoutType&);
class Log
{
public:
Log (std::ostream &);
Log (const std::string &);
~Log ();
private:
std::ostream *os;
bool file_p;
friend Log &operator<< (Log &l, const LoggedType &t)
{
t.log (*l.os);
return l;
}
template <typename T>
friend Log &operator<< (Log &l, const T &t)
{
*l.os << t;
return l;
}
friend Log &operator<< (Log &log, StandardEndLine manip)
{
manip (*(log.os));
return log;
}
};
我得到错误的LoggedType类也被匹配到模板操作符<<,当只有非LoggedType类应该使用该模板。
如何最好地解决这个问题?
您可以更改模板函数以使用SFINAE:
template <typename T>
friend
typename std::enable_if<!std::is_base_of<LoggedType, T>::value, Log &>::type
operator<< (Log &l, const T &t);
相关文章:
- 是否可以对零模板参数进行模板专门化
- 尝试根据类中 typedef 的存在来专门化模板函数
- 如何基于模板化类的基类专门化成员函数
- 如何为指向复杂值的迭代器专门化算法?
- 专门化模板覆盖函数/避免对象切片
- 我能否根据其运算符()的签名专门化可变参数模板参数
- 如何使用模板化类专门化模板化函数?
- 线程 std::调用未知类型,无法专门化函数错误
- 输入两个不专门化大小的矩阵
- 如何在模板类中专门化赋值运算符?
- 如何专门化容器和枚举的模板
- Clang拒绝类模板的嵌套类仅通过专门化定义的代码是正确的吗
- 取消专门化C++模板参数
- SFINAE的变分变量模板专门化
- 如何在编译时专门化大型模板函数中的小部分
- 如何在c++运算符()中专门化调用模板
- 模板函数,其中一个参数需要专门化,而另一个不需要
- 如何专门化字符串数组的模板?
- 如何专门化模板
- 如何避免为模板化迭代器的每个可能的实例化专门化iterator_traits?