Я пытаюсь написать функцию, которая будет возвращать универсальная лямбда с переменными аргументами, где лямбда проверяет, что один из аргументов равен определенному значению. Вот (примерно) то, что я пытаюсь сделать:
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);
};
}
Это прекрасно работает, но возвращаемая лямбда не является универсальной — она не работает ни с каким произвольным пакетом параметров.
Я не уверен, что поставить в аргумент шаблона 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);
};
}
Вы можете избежать упоминания типов, просто используя станд :: 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);
};
}