如何向流缓冲区添加参数 c++

How to add argument to stream buffer c++

提问人:Goozzi 提问时间:9/2/2020 最后编辑:miken32Goozzi 更新时间:3/26/2021 访问量:205

问:

我只是想要一种方法来拥有一个函数(或其他任何东西),它有一个标准参数和另一个来自运算符<<。

my_comp(argument) << "HelloWorld" ;

目标是创建一个 Logger 类,任何其他类都可以轻松扩展该类,并通过一行代码调用其独特的功能。

Logger 类主要使用 boost/log/ 包,其独特的功能可以多次写入。这就是为什么我希望它放在一行中。

我不授权自己使用该功能:

BOOST_LOG_SEV(argument_boost_dependent, argument_logger_class_dependent) << "something"

因为我不想在我的界面上与 boost 有任何依赖关系。

所以我正在尝试做这样的事情:

loggit(argument_logger_class_dependent) << "something"

只需在类实现中使用 boosts 参数进行调用BOOST_LOG_SEV

现在我只有一个扩展 std::streambuf 的结构,所以它只能像这样工作:或者通过覆盖运算符 () 但两者一起不起作用。loggit << "HelloLog"loggit(severity_level::warning)

如果有人知道如何添加这个甜蜜的论点,欢迎:)

谢谢

C++ 参数 运算符 streambuf

评论

1赞 Swordfish 9/2/2020
my_comp(argument) << something只是另一种写法,所以你看那将无法利用.my_comp(argument).operator<<(something)my_comp()something
0赞 Goozzi 9/2/2020
事实上,@JaMiT我不是来自一个讲英语的国家,这并不容易解释。好吧,我已经看到了具有这种结构的代码。如果我能实现它,它将出色地完成我想做的事情。如果你们认为需要更多的代码来理解我想做什么,请告诉我
0赞 Goozzi 9/2/2020
@Swordfish 但是,如果my_comp是流buff,它可以处理该部分,对吗?something
0赞 Swordfish 9/2/2020
应该怎么做?回答@JaMiT的问题。my_comp
0赞 JaMiT 9/6/2020
@Goozzi 在您的更新中有证据表明您是非英语母语人士,但总的来说,这是一个很好的描述。干得好!(与 Boost 的比较是个好主意。

答:

1赞 Swordfish 9/2/2020 #1
#include <iostream>

struct foo
{
    int bar;

    foo(int bar) : bar{ bar } {};
    foo& operator<<(std::string baz)
    {
        std::cout << bar << ' ' << baz;
        return *this;
    }
};

int main()
{
    foo(42) << "Hells in the World!\n";
}

意义?不?问题已回答?

评论

0赞 Goozzi 9/2/2020
虽然没有在每次通话中构建它!确实它解决了我的问题,TY Swordfish!但是顺便说一句,你认为有没有办法做到不每次都为了性能而构建它?
0赞 Goozzi 9/2/2020
Arf 现在,它不适合构造的原因,它是一个 InnerClass :/无论如何,我可能会改变一些东西。
0赞 Galik 9/2/2020
@Goozzi我不明白为什么这会比直线函数慢。构造函数毕竟只是一个函数。位于堆栈上意味着不会受到内存分配的惩罚。
0赞 Goozzi 9/3/2020
我只是认为每次调用时的构造/销毁都很多。但我可能错了,
2赞 Indranil 9/2/2020 #2

稍微即兴发挥一下 @Swordfish 的回答:与其每次都调用构造函数,不如重载 operator(),如下所示:

#include <iostream>

struct foo
{
    int bar;

    foo() {};
    foo& operator() (int arg)
    {
        bar = arg;
        return *this;
    }
    foo& operator<<(std::string baz)
    {
        std::cout << bar << ' ' << baz;
        // call BOOST_LOG_SEV with arg and baz
        return *this;
    }
};

int main()
{
    foo logger;
    logger(42) << "Hells in the World!\n"; //prints " 42 Hells in the World!"
    logger(32) << "So is heaven\n";  //prints "32 So is heaven"
}

评论

0赞 Goozzi 9/3/2020
就这么简单,TY indranil !