Рассмотрим интересную конструкцию из стандарта C++14, которая позволяет вернуть структуру, используемую в одном месте кода, но при этом нужно вернуть объект с именованными полями.
Такая конструкция может служить заменой std::tuple. При этом нам не нужно будет объявлять какие-то дополнительные структуры, которые мы не собираемся никуда передавать, так как нам нужно получить только набор данных, которые мы как-то используем сразу на месте возврата и не будем передавать дальше в такая же форма.
Пример нормальной функции
#include <iostream> #include <string> using namespace std; // Declare a function that will return auto auto getHero() { // We will form an unnamed structure of the return value struct { std::string name; std::string surname; int age; } result { "James", "Bond", 42 }; // Initially initialize the structure object return result; // Then you can return the resulting structure, the compiler will do everything thanks to auto } int main() { // We return this value immediately to the auto variable auto hero = getHero(); // And we can already use this object, while it will have named fields std::cout << hero.surname << "..." << hero.name << " " << hero.surname << " " << hero.age << std::endl; return 0; }
Пример лямбда-функции
Пример с лямбда-функцией в этом случае мало чем будет отличаться от обычной функции, просто будет другое место для объявления.
#include <iostream> #include <string> using namespace std; int main() { // Declare a lamda function that will return auto auto getHero = []() { // We will form an unnamed structure of the return value struct { std::string name; std::string surname; int age; } result { "James", "Bond", 42 }; // Initially initialize the structure object return result; // Then you can return the resulting structure, the compiler will do everything thanks to auto }; // We return this value immediately to the auto variable auto hero = getHero(); // And we can already use this object, while it will have named fields std::cout << hero.surname << "..." << hero.name << " " << hero.surname << " " << hero.age << std::endl; return 0; }