如何将构造函数参数转发给 boost::optional

Posted

技术标签:

【中文标题】如何将构造函数参数转发给 boost::optional【英文标题】:How to forward constructor arguments to boost::optional 【发布时间】:2019-04-01 16:58:30 【问题描述】:

我有以下简单的结构:

struct X

    X(std::string name, int value): name_(name), value_(value)

    std::string name_;
    int value_;
;

我想在不复制的情况下将它与 boost optional 一起使用。这是一种选择:

boost::optional<X> op;
op.emplace("abc", 5);

是否可以不使用 emplace 功能? (我的意思是一行表达式)

【问题讨论】:

【参考方案1】:

是的,只需使用转发 ctor args 的“就地”标签构建它!

boost::optional<X> op(boost::optional::in_place_init, "abc", 5);

(ref)

FWIW 如果您不介意搬家,那么这也可以:

boost::optional<X> op(X("abc", 5));

向下扫描该参考页面;有很多方法可以构建或填充boost::optional

【讨论】:

你的鼻子是参考页 boost::optional op(X("abc", 5));使用复制构造函数 @Irbis 为什么会这样?有一个 optional&lt;T&gt;::optional( T&amp;&amp; v ) ctor 具有记录的移动语义(请参阅链接的 ref),这里的参数是一个临时的(因此是一个右值)。 你是对的。我已经定义了一个复制ctor来查看它是否被调用并且移动构造函数尚未生成。当我定义复制和移动 ctor 时,我看到调用了 move ctor。

以上是关于如何将构造函数参数转发给 boost::optional的主要内容,如果未能解决你的问题,请参考以下文章

如何将参数从控制器传递给 FormType 构造函数

[Catel]如何将带有构造函数参数的 ViewModel 传递给 TabService 扩展方法?

将参数转发给另一个 javascript 函数

将 lambda 参数完美转发给成员函数,其中成员函数是非类型模板形参

如何转发可选参数

C++ 为类模板提供初始化列表构造函数