提问人:GiBhu 提问时间:6/9/2022 最后编辑:GiBhu 更新时间:6/10/2022 访问量:193
有没有办法在函数调用范围内初始化对象,调用其方法,然后将其作为函数参数传递?
Is there a way to initialize object, call its method, then pass it as function argument, in just the function call scope?
问:
有没有办法初始化一个对象,调用它的一些方法(不可能只将对象构造为处于所需状态),然后将其作为参数传递给函数,可能是单行,只是在调用范围内?像这样的东西:
#include <iostream>
#include <sstream>
void log(const std::ostringstream& obj) {
std::cout<<obj.str();
//Do something meaningful with obj that doesn't modify it
}
void gol(const std::string& obj) {
std::cout<<obj;
//Do something meaningful with obj that doesn't modify it
}
int main() {
log(std::ostringstream oss << "Foo" << 123 << 'B');
gol(std::string str .append("Foo").append(std::to_string(123)).append("Bar"));
}
“在调用范围内”是指对象“oss”在“log”返回后自动销毁。“str”也是如此。
我可以这样做:
int main() {
{
std::ostringstream oss;
oss << "Foo" << 123 << 'B';
log(oss);
}
{
std::string str;
str.append("Foo").append(std::to_string(123)).append("Bar"));
gol(str);
}
}
但是,它不再是真正的单行本了。
答:
0赞
463035818_is_not_an_ai
6/9/2022
#1
你可以这样写:
#include <iostream>
#include <sstream>
void log(const std::ostringstream& obj) {
std::cout<<obj.str();
//Do something meaningful with obj that doesn't modify it
}
void gol(const std::string& obj) {
std::cout<<obj;
//Do something meaningful with obj that doesn't modify it
}
int main() {
log(std::ostringstream{} << "Foo" << 123 << 'B');
gol(std::string{}.append("Foo").append(std::to_string(123)).append("Bar"));
}
不过,我不知道有一种方法可以给它一个名字,调用方法,并将其传递给另一个函数,所有这些都在同一个表达式中。
一般来说,试图将尽可能多的代码压缩到一行中并不是真正可取的。
评论
0赞
GiBhu
6/9/2022
无法编译,“错误:初始化无效”,g++ 8.1.0,-std=c++17
0赞
463035818_is_not_an_ai
6/9/2022
@GiBhu 8.1.0 相当古老。您确定它甚至具有完整的 C++11 支持吗?
0赞
GiBhu
6/9/2022
我使用 MinGW 安装程序安装,即使是现在,它也是 Web 设置上的最新版本。
0赞
463035818_is_not_an_ai
6/9/2022
也许可以尝试一下std::ostringstream()
1赞
Jarod42
6/9/2022
gcc 11.1 有问题,但没有 gcc 11.2 Demo。
评论
log(std::ostringstream() << "Foo" << 123 << 'B');
?class Log
std::ostringstream
operator<<
~Log()
Log() << "Foo" << 123 << 'B';
template <typename T> Log & append(const T &t) { str.append(std::to_string(t)); return *this; }