【发布时间】:2018-07-05 11:53:16
【问题描述】:
我想将 cerr 和 cout 包装在一个对象中,该对象有意丢弃发布版本中的所有内容。目的是确保开发人员可能忘记删除的某些调试输出不会显示给用户。
class Wrapper {
public:
Wrapper( std::ostream& os ):mOs(os){}
template <typename T>
DebugOnlyOsWrapper&
operator<<( T&& in ){
#ifndef NDEBUG
mOs << std::forward<T>(in);
#endif
return *this;
}
private:
std::ostream& mOs;
};
extern DebugOnlyOsWrapper dcout;
extern DebugOnlyOsWrapper dcerr;
但是,如下调用运算符时出现“无法推断模板参数'T'”错误:
dcerr << std::endl;
我做错了什么?难道不能从函数指针中推导出类型吗?
请注意,添加以下运算符重载可以解决问题,但我想限制代码重复并了解问题的性质。
using CharT = std::ostream::char_type;
using Traits = std::ostream::traits_type;
Wrapper& operator<<(std::ios_base& (*func)(std::ios_base&) ){
#ifndef NDEBUG
mOs << func;
#endif
return *this;
}
Wrapper& operator<<(
std::basic_ios<CharT,Traits>&
(*func)(std::basic_ios<CharT,Traits>&)
){
#ifndef NDEBUG
mOs << func;
#endif
return *this;
}
Wrapper& operator<<(
std::basic_ostream<CharT,Traits>&
(*func)(std::basic_ostream<CharT,Traits>&)
){
#ifndef NDEBUG
mOs << func;
#endif
return *this;
}
谢谢
【问题讨论】:
-
我会说stackoverflow.com/questions/51170934/… 最终会导致同样的问题,但问题不同。