Инициализация нескольких членов с использованием нескольких возвращаемых значений

Начиная с C++17 я могу сделать

std::pair<int, double> init () {
    return std::make_pair (1, 1.2);
}

void foo () {
    const auto [x, y] = init ();
    std::cout << x << " " << y << "\n";
}

Это круто, но есть ли способ инициализировать несколько участников одновременно? Я имею в виду:

struct X {
    X () : [x, y] {read_from_file_all_values ()} {}

    std::pair<int, double> read_from_file_all_values () {
        // open file, read all values, return all
        return std::make_pair (1, 1.2);
    }

    const int x;
    const double y;
};

Я знаю, это не работает из-за синтаксиса. Я также знаю, что могу хранить все значения в соответствующих std::pair член внутри X и делают добытчики, которые перегружают уродливые std::get<N> () синтаксис, но есть ли способ инициализировать несколько членов с одним init() функционировать? Поскольку эти члены const, я не могу сделать это в теле конструктора.

1 ответ

Решение

Не используется структурированное связывание, но вы можете иметь приватный конструктор, принимающий std::pair и инициализировать consts. Затем пусть ваш конструктор по умолчанию делегируется этому конструктору с результатом вашей функции.

Другие вопросы по тегам