首页 > 解决方案 > 记录器系统 - 使用级别 c++

问题描述

如何使用(在类中包装 ostream 并模板化 << 运算符)中的函数

我想为记录器使用 SEVERITY 级别,每个级别可以采用任意数量的 msg/ 元素

此类接受对象中元素的任意数量,但对于类 ex 中的每个函数,我也需要它:

ClassName ClassObject(&std::cout)
ClassObject.info() << "test msg" << 5 << 10 << endl;

这是我的课

class logger {

private:
    ostream * str;

public:

    logger( ostream* str_v) : str(str_v) {}

    template <class T>
    logger& operator<<(T&& x) {
        *str << std::forward<T>(x);
        return *this;
    }

    logger& operator<<(ostream& (*manip)(ostream&)) {
        *str << manip;
        return *this;
    }

    void info(){
        cout <<"hello world"<<endl;
    }
};

int main(){

   logger l(&std::cout);
    l << 5 << std::string(" test")<<endl;
   //I want to use info like that
   l.info() << "print anything" << 5 << endl;

    return 0;

}

标签: c++ooploggingwrapperostream

解决方案


对于一个非常简单的解决方案,让我们info()写入*str并返回对的引用*this

logger& info()
{
    *str << "info - ";
    return *this;
}

然后可以随意使用:

l.info() << "print anything" << 5 << endl;

上面应该打印

信息 - 打印任何东西 5

推荐阅读