gpt4 book ai didi

c++ - 传递文件或标准输入以模糊地 boost 进程子进程

转载 作者:行者123 更新时间:2023-12-04 08:12:58 25 4
gpt4 key购买 nike

我正在尝试编写一个基于 boost::process 的程序,该程序能够根据是否定义了将它们重定向到的文件来模糊地重定向输入、输出和错误流,但我正在努力弄清楚如何处理它:

#include <string>
#include <boost/process.hpp>

int main(){
std::string in;
std::string out("out.txt");

namespace bp = boost::process;

bp::child c(bp::exe("test.exe"), bp::std_in < (in.empty() ? stdin : in), bp::std_out > (out.empty() ? stdout : out)); // error

return 0;
}
显然,三元运算符将不起作用,因为类型不兼容,但我不知道如何实现。我探索了 boost::variant 和 boost::any 但无济于事。

最佳答案

Boost 选择了一种对熟悉命令行重定向的人来说很直观的表示法。但是,请记住这是 C++。 <>符号仍然是运算符;它们没有成为命令行参数。代码bp::std_out > stdout是一个表达式。它评估为某种记录标准输出应该去哪里的对象。

适应不同类型的一个技巧是调整条件产生的点。而不是有条件地选择 operator< 的参数和 operator> , 有条件地选择 bp::child 的参数构造函数:

bp::child c(bp::exe("test.exe"),
in.empty() ? (bp::std_in < stdin) : (bp::std_in < in),
out.empty() ? (bp::std_out > stdout) : (bp::std_out > out));
如果不是操作符重载,这会更明显。即使两者 <上面的符号看起来一样,它们命名不同的运算符,因为它们的操作数类型不同。您的情况基本上需要调用 f(bp::std_in, stdin)g(bp::std_in, in) ,并且无法将这些调用与三元运算符合并。这很令人困惑,因为不是 fg , 运算符(operator)名称为 << .
您可能希望使用辅助变量使代码更易于阅读:
auto in_stream  =  in.empty() ? (bp::std_in  < stdin)  : (bp::std_in  < in);
auto out_stream = out.empty() ? (bp::std_out > stdout) : (bp::std_out > out);

bp::child c(bp::exe("test.exe"), in_stream, out_stream);

关于c++ - 传递文件或标准输入以模糊地 boost 进程子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65860643/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com