带有简单Logger的流操纵器

动态的

所以我有这个简单的C ++ Logger类。

class Log{
public:
    Log(const int& msgLevel = 1){
        this->msgLevel = msgLevel;
    }

    template <class T>
    Log& operator<<(const T& v){
        if (msgLevel<=level) {
            std::cout << v;
        }
        return *this;
    }

    ~Log(){

    }

    static int level;
    int msgLevel;
};

int Log::level = 1;

我可以这样使用它:

Log(1)<<"My debug info: "<<otherVariable;

问题是当我尝试使用时endl

Log(1)<<"My debug info: "<<otherVariable<<endl;

我收到此错误:

error C2678: binary '<<' : no operator found which takes a left-hand operand of type 'Log' (or there is no acceptable conversion)

要解决此错误,我需要向类中添加另一个方法,如下所示:

// For manipulators like endl
Log& operator<< (ostream& (*pf) (ostream&)) {
    if (msgLevel<=level) {
        cout << pf;
    }

    return *this;
}

但是添加这种方法来处理endl它对我来说似乎有点过大了。还有更好的选择吗?

另一种选择是仅使用“ \ n”代替endl;

沃恩·卡托(Vaughn Cato)

因为endl是函数模板,所以简单的版本operator<<还不够好,因为可以通过使用的不同模板参数来匹配多种可能的方式endl添加第二个重载可能是您可以做的最好的事情。

但是,您可以考虑如下通用逻辑:

template <class T>
Log& operator<<(const T& v){ return write(v); }

Log& operator<<(ostream& (*v)(ostream&)){ return write(v); }


template <typename T>
Log& write(const T &v)
{
    if (msgLevel<=level) {
        std::cout << v;
    }
    return *this;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

带有简单Logger的流操纵器

来自分类Dev

定制流操纵器

来自分类Dev

为什么C ++流操纵器没有调用运算符?

来自分类Dev

C ++中的流操纵器如何成为函数?

来自分类Dev

重载流操纵器运算符

来自分类Dev

粘性操纵器有官方资源吗

来自分类Dev

C ++将流操纵器复制到其他流

来自分类Dev

将C ++流操纵器链接到单个变量中

来自分类Dev

在C ++中使用流操纵器解析std :: uint类型

来自分类Dev

如何制作语法操纵器?

来自分类Dev

是否有任何std :: istream操纵器消耗了输入中的预定义字符串?

来自分类Dev

可以轮询标准C ++ iostream操纵器的状态吗?

来自分类Dev

C ++表达式SFINAE和ostream操纵器

来自分类Dev

C ++ setiosflags函数操纵器-缩进量不确定

来自分类Dev

尾流操纵器在C ++表达式中的含义

来自分类Dev

提供<<和>>的功能的是I/O操纵器吗?

来自分类Dev

带有 aiozmq 流的简单 PUB/SUB

来自分类Dev

当转发到std :: ostream <<时,操纵器的模板参数推导失败

来自分类Dev

带有rpcgen的简单计算器

来自分类Dev

带有rpcgen的简单计算器

来自分类Dev

文本未附加在新文件中,试图创建文本文件操纵器

来自分类Dev

带有Django的简单远程服务器

来自分类Dev

带有JQuery的简单JavaScript计算器

来自分类Dev

通过简单注入器传递带有变量的类

来自分类Dev

带有简单图像浏览器插件的CKEditor

来自分类Dev

为什么仅在固定工作时需要同时使用固定和显示点操纵器来显示小数点和尾随零?

来自分类Dev

带有文件流的RAII

来自分类Dev

带有SSL流的UDP

来自分类Dev

带有反应流的误报