Условный оператор в списке членской инициализации

Предположим, что у меня есть этот класс:

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(), есть ли иначе?

11
задан Zack 5 February 2010 в 11:54
поделиться

2 ответа

Результатом условного оператора всегда является фиксированный тип, определяемый во время компиляции путем нахождения общего типа, в который могут быть преобразованы оба параметра. (Точные правила немного сложны, но при обычном использовании они обычно «делают правильные вещи».)

В вашем примере проще всего сделать так, чтобы этот тип был временным foo и затем используйте конструктор копирования для инициализации _f в баре.

Вы можете сделать это следующим образом.

_f( condition ? foo("string") : foo() )
16
ответ дан 3 December 2019 в 07:37
поделиться

Если передача пустой строки эквивалентна вызову конструктора без аргументов, вы можете сделать следующее:

_f(condition ? "string" : "")

Это сэкономит вам копию.

0
ответ дан 3 December 2019 в 07:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: