提问人:Goozzi 提问时间:9/2/2020 最后编辑:miken32Goozzi 更新时间:3/26/2021 访问量:205
如何向流缓冲区添加参数 c++
How to add argument to stream buffer c++
问:
我只是想要一种方法来拥有一个函数(或其他任何东西),它有一个标准参数和另一个来自运算符<<。
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)
如果有人知道如何添加这个甜蜜的论点,欢迎:)
谢谢
答:
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 !
评论
my_comp(argument) << something
只是另一种写法,所以你看那将无法利用.my_comp(argument).operator<<(something)
my_comp()
something
something
my_comp