我试图编写一个函数,它将返回带有可变参数的generic lambda,其中lambda检查其中一个参数是否等于特定值。这是(大致)我想要做的事情:
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);
};
}
这样可以正常工作,但返回的lambda不是通用的 - 它不适用于任意参数包。
答案 0 :(得分:8)
您可以通过简单地使用std::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);
};
}
答案 1 :(得分:6)
我不确定将什么放入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);
};
}