Продление срока действия возврата initializer_list

Так что у меня есть лямбда, который возвращает тип auto и у меня возникают проблемы с поддержкой массива для initializer_list разрушается здесь:

const auto foo = [](const auto& a, const auto& b, const auto& c) { return {a, b, c}; };

Я буду использовать лямбду следующим образом:

auto bar = foo(1, 2, 3);

for(const auto& i : bar) cout << i << endl;

Работа, над которой я работаю, является частью их стандарта кодирования, согласно которому все лямбда-выражения являются отдельными утверждениями (не стесняйтесь выражать свое возмущение.)

  1. дающий foo тип возврата vector int, но это портит, как это красиво: const auto foo = [](const auto& a, const auto& b, const auto& c) -> vector<int> { return {a, b, c}; }
  2. Просто написание шаблонизированной функции, которая создает vector<T> и возвращает его: template <typename T> vector<T> foo(const T& a, const T& b, const T& c){ return {a, b, c}; }

Можно ли привести эти переменные в контейнер, поддержка которого не будет уничтожена в одной строке, чтобы я мог сохранить лямбду с auto тип возврата?

1 ответ

Решение

Библиотека основ TS v2 имеет std::experimental::make_array, что наверняка удовлетворит ваши требования:

#include <experimental/array>
const auto foo = [](const auto& a, const auto& b, const auto& c) {
    return std::experimental::make_array(a, b, c); };

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

const auto foo = [](const auto& a, const auto& b, const auto& c) {
    return std::vector{a, b, c}; };
                      ^-- no template parameter required

Сегодня вы можете подражать этому, используя common_type:

const auto foo = [](const auto& a, const auto& b, const auto& c) {
    return std::vector<std::common_type_t<decltype(a), decltype(b), decltype(c)>>{a, b, c}; };
Другие вопросы по тегам