要创建一个boost::process with output重定向,您应该这样做:
bp::ipstream out;
bp::child c("c++filt", std_out > out);现在,有条件地控制重定向的语法是什么:
bool redirect = true; // or false
bp::ipstream out;
bp::child c("c++filt", (redirect) ? std_out > out : "what should I put here??" );发布于 2017-12-05 10:16:56
花哨的boost::process API围绕着提供实现on_setup、on_error、on_success (以及可能更多的方法,取决于当前操作系统)的handler对象,这些方法将在某些内部进程启动程序的上下文中在进程构造调用中执行,并且能够更改进程启动程序的行为。std_out > out是一个重载的操作符,它将返回这样的处理程序。更多信息可以在boost过程扩展文档上找到。
因此,有条件地控制重定向和其他参数的一般方法是编写泛型处理程序代理,接受可选的实处理程序,并调用实处理程序的适当方法:
#include <boost/process.hpp>
#include <boost/process/extend.hpp>
#include <boost/optional.hpp>
#include <memory>
#include <utility>
template<typename TRealHandler> class
t_OptionalHandler
: public ::boost::process::extend::handler
{
private: using t_OptionalRealHandler = ::boost::optional<TRealHandler>;
private: t_OptionalRealHandler m_real_handler;
public:
t_OptionalHandler(void)
: m_real_handler{}
{}
public: explicit
t_OptionalHandler(TRealHandler && real_handler)
: m_real_handler{::std::move(real_handler)}
{}
template<typename TExecutor>
void on_setup(TExecutor & e) const
{
if(m_real_handler)
{
m_real_handler.get().on_setup(e);
}
}
template<typename TExecutor>
void on_error(TExecutor & e, const std::error_code & code) const
{
if(m_real_handler)
{
m_real_handler.get().on_error(e, code);
}
}
template<typename TExecutor>
void on_success(TExecutor & e) const
{
if(m_real_handler)
{
m_real_handler.get().on_success(e);
}
}
};
int main()
{
bool const need_to_redirect{false};
::std::unique_ptr<::boost::process::ipstream> const p_stream
{
need_to_redirect?
new ::boost::process::ipstream{}
:
nullptr
};
using t_OptionalStdOutRedirectionHandler = t_OptionalHandler
<
decltype(::boost::process::std_out > *p_stream)
>;
::boost::process::child ch
(
"cmd"
, need_to_redirect?
t_OptionalStdOutRedirectionHandler{::boost::process::std_out > *p_stream}
:
t_OptionalStdOutRedirectionHandler{}
);
ch.wait();
return(0);
}https://stackoverflow.com/questions/47630796
复制相似问题