记录器库中POD类型的c++模板专门化

C++ template specialization for POD types in logger library

本文关键字:c++ 专门化 类型 POD 记录器      更新时间:2023-10-16

我正在滚动我自己的日志库。这个想法是有一个接口类,必须从它派生,以便对象能够从中记录日志。

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);