У меня есть функция GetThing
следующим образом:
auto GetThing(size_t index, auto&& l1)
{
return l1;
}
auto GetThing(size_t index, auto&& l1, auto&&... rest)
{
if (index == 0)
return l1;
return GetThing(index - 1, rest...);
}
Я хочу, чтобы он также мог работать с разными лямбда-выражениями, в то же время имея возможность обрабатывать другие типы (имеются в виду не лямбда-выражения, не функции, такие как int
и...) , например
std::cout << GetThing(1, 2, 3, 4); //works, return 3
std::cout << GetThing(1, [] {return 0; },
[] {return 1; }, [] {return 2; },
[] {return 3; } )(); //nope
Но проблема здесь в том, что лямбда-выражения имеют другой тип, поэтому рекурсивная функция будет выводить несовместимый тип возвращаемого значения, поэтому мне, кажется, придется использовать std::function
вот так, но это уродливо.
std::cout << GetThing(1, std::function{ [] {return 0; } }, std::function{ [] {return 1; } }, std::function{ [] {return 2; } }, std::function{ [] {return 3; } })();//works
Любой возможный способ обойти это, например, если есть перегруженный operator()
, он автоматически применяет тип std::function
?
РЕДАКТИРОВАТЬ: я знаю, что лямбда-выражения без захвата могут быть преобразованы в указатель функции, но как вывести это таким образом без std::decay
в шаблоне? Потому что я все еще хочу обрабатывать другие типы как ссылки
EDIT2: я получаю несколько ответов, используя std::variant
, и я думаю о том, что, помимо лямбда, типы параметров должны быть одинаковыми, например. std::variant<int, int, int>
. Возможно, можно добавить перегрузку к GetThing
, чтобы, когда std::variant
содержит те же типы, он возвращал объект этого типа, в противном случае (в случае получения лямбда-выражений) возвращал std::function
GetLambda
? опечатка? Можете ли вы опубликовать минимально воспроизводимый пример? - person 463035818_is_not_a_number   schedule 03.08.2020std::function
. - person songyuanyao   schedule 03.08.2020GetThing(1, +[]{return 0;}, ...)
(примечание+
), что не так уродливо, какstd::function
. - person HolyBlackCat   schedule 03.08.2020std::array{a, b, c}[i]
. Даже если вы хотите сохранить функцию, я предлагаю избавиться от рекурсии. - person HolyBlackCat   schedule 03.08.2020