Как получить типы из пакета с переменными параметрами в универсальной лямбде?

Я пытаюсь написать функцию, которая будет возвращать универсальная лямбда с переменными аргументами, где лямбда проверяет, что один из аргументов равен определенному значению. Вот (примерно) то, что я пытаюсь сделать:

template <int Index, typename TValue>
inline auto arg_eq(const TValue& value)
{
return [value] (auto... args) -> bool {
return (std::get<Index>(std::tuple</* ??? */>(args...)) == value);
};
}

Я не уверен, что положить в std::tuple</* ??? */> аргумент шаблона. я пробовал decltype(args), decltype(args...), auto, auto...и еще несколько вещей, но я продолжаю получать ошибки компилятора. Это вообще возможно?

Неуниверсальный эквивалент будет выглядеть примерно так:

template <int Index, typename TValue, typename... TArgs>
inline auto arg_eq(const TValue& value)
{
return [value] (TArgs... args) -> bool {
return (std::get<Index>(std::tuple<TArgs...>(args...)) == value);
};
}

Это прекрасно работает, но возвращаемая лямбда не является универсальной — она ​​не работает ни с каким произвольным пакетом параметров.

4

Решение

Я не уверен, что поставить в аргумент шаблона std :: tuple. Я пробовал decltype (args), decltype (args …), auto, auto … и некоторые другие вещи, но я продолжаю получать ошибки компилятора.

Попробуй с

std::tuple<decltype(args)...>

Полная функция

template <int Index, typename TValue>
inline auto arg_eq(const TValue& value)
{
return [value] (auto... args) -> bool {
return (std::get<Index>(std::tuple<decltype(args)...>(args...))
== value);
};
}
6

Другие решения

Вы можете избежать упоминания типов, просто используя станд :: make_tuple:

template <int Index, typename TValue>
auto arg_eq(const TValue& value)
{
return [value] (auto... args) -> bool {
return (std::get<Index>(std::make_tuple(args...)) == value);
};
}
8

По вопросам рекламы [email protected]