C++14 - неименованная структура в качестве auto значения возвращаемого функцией

C++, C++14, auto, lambda

Содержание

Давайте рассмотрим интересную конструкцию из стандарта 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;
}

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
- блог компании
Поддержать автора Donate

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Как стать автором?

Внесите вклад в развитие сообщества EVILEG.

Узнайте, как стать автором сайта.

Изучить
Donate

Добрый день, Дорогие Пользователи !!!

Я Евгений Легоцкой, разработчик EVILEG. И это мой хобби-проект, который помогает учиться программированию другим программистам и разработчикам

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

PayPalYandex.Money
Timeweb

Позвольте мне порекомендовать вам отличный хостинг, на котором расположен EVILEG.

В течение многих лет Timeweb доказывает свою стабильность.

Для проектов на Django рекомендую VDS хостинг

Посмотреть Хостинг Timeweb
6 июня 2020 г. 0:20
Алексей

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:60баллов,
  • Очки рейтинга-1
6 июня 2020 г. 0:15
Алексей

C++ - Тест 001. Первая программа и типы данных

  • Результат:53баллов,
  • Очки рейтинга-4
V
5 июня 2020 г. 17:47
Vladzo

C++ - Тест 005. Структуры и Классы

  • Результат:83баллов,
  • Очки рейтинга4
Последние комментарии
5 июня 2020 г. 11:52
progammist

Распознавание изображений на Python с помощью TensorFlow и Keras

Огромное спасибо за метериал, по-больше бы подобных статей (с подробным описанием работы и примерами применения) на тему современных технологий. Вопрос поразмышлять. На текущий момент реал…
5 июня 2020 г. 2:39
Евгений Легоцкой

Qt/C++ - Урок 091. Как написать кастомный делегат управляющий подсветкой строки в таблице

По-моему, смысла в этом нет особого. Если делегат будет игнорировать настройки таблицы, то это приведёт ещё к большему непониманию, что вообще происходит, для программиста, который после вас буд…
5 июня 2020 г. 2:34
IscanderChe

Qt/C++ - Урок 091. Как написать кастомный делегат управляющий подсветкой строки в таблице

Сижу, размышляю: можно ли переписать делегата так, чтобы независимо от настроек строк выделялись строки?
5 июня 2020 г. 2:31
Евгений Легоцкой

Qt/C++ - Урок 091. Как написать кастомный делегат управляющий подсветкой строки в таблице

Понятно. Я не обратил внимания на то, что там было в старом коде по настройкам строк :)
Сейчас обсуждают на форуме
s
6 июня 2020 г. 2:54
shuric

Qt/C++ Определение положения курсора над действие(кнопкой) в QToolBar

Доброго дня. Возник вопрос - как можно определить что курсор находится над определенным действием(кнопкой) в qtoolbar ? mainwindow.cpp MainWindow::MainWi…
s
6 июня 2020 г. 1:45
shuric

Qt/C++ особенности QProxyStyle

Да, Вы правы. Код был скопирован с сайта (уже не помню с какого), но решил пойти по пути более легком. Пришлось переписать - кому интересно: использовал stackedWidget для пе…
6 июня 2020 г. 0:08
Алексей

Посоветуйте новичку (базы данных и Qt, что учить)

Блин, а я недавно купил Шлее Qt 5.10 :( С детства хотел стать программистом, баловался Паскалем, писал простенькие программки на Delphi, создавал движок на php, изучал C (забросил и перешел на п…
5 июня 2020 г. 14:09
IscanderChe

QPlainTextEdit настройка цвета фона

Вечер добрый. Пытаюсь настроить цвет фона QPlainTextEdit следующим образом: CodeEditor::CodeEditor(QWidget *parent) : QPlainTextEdit(parent){ ... QPalette::ColorRole role = bac…
5 июня 2020 г. 7:13
IscanderChe

Фильтр для QtableView sql

Добрый день. Для такой фильтрации необходимо использовать QSortFilterProxyModel. В оффдоках есть хороший пример.
О нас
Услуги
© EVILEG 2015-2020
Рекомендует хостинг TIMEWEB