有没有办法在函数调用范围内初始化对象,调用其方法,然后将其作为函数参数传递?

Is there a way to initialize object, call its method, then pass it as function argument, in just the function call scope?

提问人:GiBhu 提问时间:6/9/2022 最后编辑:GiBhu 更新时间:6/10/2022 访问量:193

问:

有没有办法初始化一个对象,调用它的一些方法(不可能只将对象构造为处于所需状态),然后将其作为参数传递给函数,可能是单行,只是在调用范围内?像这样的东西:

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

但是,它不再是真正的单行本了。

C++ 函数 对象 按引用传递

评论

3赞 Jarod42 6/9/2022
log(std::ostringstream() << "Foo" << 123 << 'B');?
0赞 Goswin von Brederlow 6/9/2022
你也可以创建一个,在构造函数中创建一个,在 中提供并执行有意义的操作。然后你打电话给class Logstd::ostringstreamoperator<<~Log()Log() << "Foo" << 123 << 'B';
0赞 GiBhu 6/9/2022
@GoswinvonBrederlow 我忘了提到我需要调用一般的方法(那些返回对对象的引用(返回 *this)以便我可以链接的方法)
0赞 Goswin von Brederlow 6/9/2022
这仍然适用于 Log 对象,您只需要拥有该示例即可。template <typename T> Log & append(const T &t) { str.append(std::to_string(t)); return *this; }

答:

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