如何将参数添加到流缓冲区 C++

How to add argument to stream buffer c++

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

my_comp(argument) << "HelloWorld" ;

我们的目标是设计一个 Logger class,任何其他 class 都可以轻松扩展并使用一行代码调用其独特的功能。

Loggerclass主要使用boost/log/包,其独特的功能可能会被多次写入。这就是为什么我想要它在一行中。

我没有授权自己使用该功能:

BOOST_LOG_SEV(argument_boost_dependent, argument_logger_class_dependent) << "something"

因为我不想对我的界面有任何依赖。

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

loggit(argument_logger_class_dependent) << "something"

并在 class 实现中使用 boosts 参数调用 BOOST_LOG_SEV

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

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

谢谢

#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";
}

有道理吗?不?问题已回答?

对@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"
}