Evgenii Legotckoi
21 серпня 2019 р. 13:56

C++14 - неіменованого структура як auto значення, що повертається функцією

Давайте розглянемо цікаву конструкцію зі стандарту C++14, яка дозволяє повернути структуру, використовувану в одному тільки місці коду, але при цьому потрібно повернути об'єкт з ім'ям полями.

Подібна конструкція може служити заміною std::tuple. При цьому нам не потрібно буде оголошувати якісь додаткові структури, які ми не збираємося нікуди передавати, оскільки нам потрібно отримати тільки комплект даних, які вже будемо якимось чином використовувати відразу в місці повернення і не будемо передавати далі в тому ж вигляді.


Приклад зі звичайною функцією

#include <iostream>
#include <string>

using namespace std;

// Оголосимо функцію, яка буде повертати значення auto
auto getHero()
{
    // Сформуємо неіменованого структуру значення, що повертається
    struct
    {
    std::string name;
    std::string surname;
    int age;
    } result { "James", "Bond", 42 }; // Відразу ж инициализируем об'єкт структури
    return result; // Далі можна повернути отриману структуру, компілятор сам все зробить завдяки auto
}

int main()
{
    // Повертаємо дане значення відразу в auto змінну
    auto hero = getHero();
    // І вже можемо використовувати даний об'єкт, при цьому він буде мати іменовані поля
    std::cout << hero.surname << "..." << hero.name << " " << hero.surname << " " << hero.age << std::endl;
    return 0;
}

Приклад з лямбда функцією

Приклад з лямбда функцією мало чим відрізнятиметься в даному випадку від звичайної функції, просто буде інше місце оголошення.

#include <iostream>
#include <string>

using namespace std;

int main()
{
    // Оголосимо функцію, яка буде повертати значення auto
    auto getHero = []()
    {
        // Сформуємо неіменованого структуру значення, що повертається
        struct
        {
        std::string name;
        std::string surname;
        int age;
        } result { "James", "Bond", 42 }; // Відразу ж инициализируем об'єкт структури
        return result; // Далі можна повернути отриману структуру, компілятор сам все зробить завдяки auto
    };

    // Повертаємо дане значення відразу в auto змінну
    auto hero = getHero();
    // І вже можемо використовувати даний об'єкт, при цьому він буде мати іменовані поля
    std::cout << hero.surname << "..." << hero.name << " " << hero.surname << " " << hero.age << std::endl;
    return 0;
}

Вам це подобається? Поділіться в соціальних мережах!

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up