Объявите переменную, тип которой имеет удаленный конструктор по умолчанию, без значения - PullRequest
0 голосов
/ 23 марта 2020

Я хочу инициализировать переменную в нескольких ветвях if-else, чтобы использовать ее позже, в основном так:

Foo foo;

if (someCondition) {
    std::string someString = getTheString();
    // do some stuff
    foo = Foo(someString);
} else {
    int someInt = getTheInt();
    //do some other stuff maybe
    foo = Foo(someInt);
}

// use foo here

К сожалению, в этом примере тип Foo имеет удаленный конструктор по умолчанию, поэтому код выше не компилируется. Есть ли способ инициализировать такую ​​переменную таким образом?

РЕДАКТИРОВАТЬ:

Как вы можете видеть в моем примере, я использую различные конструкторы, а также делаю другие вещи в блоках if / else, так что, к сожалению, троичный оператор не работает.
Если нет способа, если бы foo не был указателем, я, очевидно, мог бы выбрать другой подход, но мне было любопытно, если мой подход каким-то образом сработал.

1 Ответ

6 голосов
/ 23 марта 2020

Вы не сказали нам почему вы не можете использовать указатель ... но пока что есть решение, которое якобы не содержит указателей:

#include <optional>    
std::optional<Foo> foo;

if (someCondition) {
    std::string someString = getTheString();
    // do some stuff
    foo.emplace(someString);
} else {
    int someInt = getTheInt();
    //do some other stuff maybe
    foo.emplace(someInt);
}
if (foo.has_value()) { /* use foo here */ }

Если у вас есть стандарт кодирования или что-то, что запрещает использование raw указателей (и new), то вы можете использовать std::unique_ptr.

#include <memory>
std::unique_ptr<Foo> foo;

if (someCondition) {
    std::string someString = getTheString();
    // do some stuff
    foo = std::make_unique<Foo>(someString);
} else {
    int someInt = getTheInt();
    //do some other stuff maybe
    foo = std::make_unique<Foo>(someInt);
}
if (foo) {/* use foo here */}

Вы также можете поместить свою Foo логику создания c в отдельную функцию (или лямбду):

auto getFoo(/* ... */) {
    if (someCondition) {
        std::string someString = getTheString();
        // do some stuff
        return Foo(someString);
    } else {
        int someInt = getTheInt();
        //do some other stuff maybe
        return Foo(someInt);
   }
}
// ...
Foo foo = getFoo(/*...*/);
// use foo here
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...