Предположим, что у меня есть этот класс:
class foo
{
public:
foo() { }
foo(const std::string& s) : _s(s) { }
private:
std::string _s;
};
Который является членом другого класса:
class bar
{
public:
bar(bool condition) :
_f(condition ? "go to string constructor" : **go to empty ctor**)
{
}
private:
foo _f;
};
При инициализации _f
в bar
членская инициализация перечисляет, я хотел бы выбрать который конструктор foo
вызвать на основе condition
.
Что я могу поместить вместо go to empty ctor
сделать эту работу? Я думал о помещении foo()
, есть ли иначе?
Результатом условного оператора всегда является фиксированный тип, определяемый во время компиляции путем нахождения общего типа, в который могут быть преобразованы оба параметра. (Точные правила немного сложны, но при обычном использовании они обычно «делают правильные вещи».)
В вашем примере проще всего сделать так, чтобы этот тип был временным foo
и затем используйте конструктор копирования для инициализации _f
в баре.
Вы можете сделать это следующим образом.
_f( condition ? foo("string") : foo() )
Если передача пустой строки эквивалентна вызову конструктора без аргументов, вы можете сделать следующее:
_f(condition ? "string" : "")
Это сэкономит вам копию.