c++ - 如何从通用 lambda 中的可变参数包中获取类型?

标签 c++ lambda c++14 variadic-templates generic-lambda

我正在尝试编写一个将返回 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 不是通用的 - 它不适用于任何任意参数包。

最佳答案

您可以通过简单地使用 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);
    };
}

关于c++ - 如何从通用 lambda 中的可变参数包中获取类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41435576/

相关文章:

c++ - 执行参数未提供预期结果

C++ 编程创造性问题解决

c++ - 多索引插入失败返回( boost )

java - Eclipse 显示错误,而 ndk_build 成功

c# - 引用列表项构造 C# Lambda 表达式

java - 使用方法引用时参数不匹配

java - 为什么 flatMap() 之后的 filter() 在 Java 流中是 "not completely"懒惰的?

c++ - 带有移动迭代器的独特算法

c++ - decltype 说明符的用途

c++ - 类划分头文件和定义文件