简体   繁体   English

在类构造函数成员初始值设定项列表上有条件地构造一个 `boost::optional` 成员变量

[英]Conditionally construct a `boost::optional` member variable on class constructor member initializer list

Suppose I have a non-copyable and non-moveable class Person :假设我有一个不可复制和不可移动的类Person

struct Person
{
  int m_icNum;

  explicit Person(int icNum) : m_icNum(icNum) {}
  Person (const Person & other) = delete;
  Person (Person && other) = delete;
};

And another class PersonContainer :另一个类PersonContainer

struct PersonContainer
{
  boost::optional<Person> m_person;

  explicit PersonContainer(int icNum)
  : m_person( icNum >= 0 ? Person(icNum) : boost::none) // this does not compile because the two operands of ternary operator ? must have the same type
  {}
};

Apparently I cannot construct m_person using ternary expression in the initializer list.显然我无法在初始化列表中使用三元表达式构造m_person An alternative is to construct it in the ctor body using boost::in_pace , but I wonder if there is a nice way to construct it in the initializer list.另一种方法是使用boost::in_pace在 ctor 主体中构造它,但我想知道是否有一种很好的方法可以在初始化列表中构造它。

Inspired by @kabanus' comment, this can be achieved using boost::in_place_init_if :受@kabanus 评论的启发,这可以使用boost::in_place_init_if来实现:

struct PersonContainer
{
  boost::optional<Person> m_person;

  explicit PersonContainer(int icNum)
  : m_person(boost::in_place_init_if, icNum >= 0, icNum)
  {}
};

You can explicitly specify the ternary operator return type to be boost::optional<Person> .您可以将三元运算符的返回类型明确指定为boost::optional<Person>

explicit PersonContainer(int icNum)
  : m_person( icNum >= 0 ? boost::optional<Person>{Person(icNum)} : 
                           boost::optional<Person>{boost::none}) 
  {}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 初始化列表:基类的构造函数和成员函数 - initializer list: a constructor from the base class and a member function 构造函数干扰成员变量指定的初始化程序? - Constructor interferes with member variable designated initializer? 使用成员初始化器列表初始化 class object 的参考变量? - initializing reference variable of class object with member initializer list? 具有成员初始化程序列表的C ++结构构造函数 - C++ struct constructor with member initializer list 构造函数初始化列表中的非成员初始化 - Non-member initialization in constructor initializer list 成员初始值设定项列表中自定义对象数组的构造函数 - Constructor for array of custom objects in member initializer list 将构造函数库和成员初始化器列表与继承一起使用 - Using constructor base and member initializer list with inheritance 在成员初始化列表之前的构造函数中抛出异常? - Throwing exception in constructor before member initializer list? 从成员构造函数抛出异常(大括号初始化程序与初始化程序列表) - Throwing exception from member constructor (brace initializer vs initializer list) 在类定义中使用删除的副本构造函数和初始化程序列表重载调用成员构造函数 - Calling a member constructor in class definition with a deleted copy constructor and initializer list overload
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM