首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >参数大小可变的函数:如何有条件地设置参数?

参数大小可变的函数:如何有条件地设置参数?
EN

Stack Overflow用户
提问于 2017-12-04 10:03:03
回答 1查看 636关注 0票数 1

要创建一个boost::process with output重定向,您应该这样做:

代码语言:javascript
复制
bp::ipstream out;
bp::child c("c++filt", std_out > out);

现在,有条件地控制重定向的语法是什么:

代码语言:javascript
复制
bool redirect = true; // or false
bp::ipstream out;
bp::child c("c++filt", (redirect) ? std_out > out : "what should I put here??" );
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-05 10:16:56

花哨的boost::process API围绕着提供实现on_setupon_erroron_success (以及可能更多的方法,取决于当前操作系统)的handler对象,这些方法将在某些内部进程启动程序的上下文中在进程构造调用中执行,并且能够更改进程启动程序的行为。std_out > out是一个重载的操作符,它将返回这样的处理程序。更多信息可以在boost过程扩展文档上找到。

因此,有条件地控制重定向和其他参数的一般方法是编写泛型处理程序代理,接受可选的实处理程序,并调用实处理程序的适当方法:

代码语言:javascript
复制
#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);
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47630796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档