c++ - 是否可以使 lambda 签名中的模板变量通用?

标签 c++ templates lambda c++17 generic-lambda

假设您有一个接受 std::vector 的函数任何类型并以某种方式处理它:

template<typename T>
void foo(std::vector<T> &vec) {
    // work with vec
}

C++14 ,我们可以用 lambdas 达到同样的目的。在这种情况下,我们称它们为generic lambdas,因为我们向它们引入了类似模板的推导:

auto foo_lambda = [](std::vector<auto> &vec) {
    // work with vec
};

但对我来说,我们的选择似乎非常有限。假设我不仅要引入类型推导,还需要引入模板值。例如,让我们更改 std::vectorstd::array :

template<typename T, std::size_t size>
void foo(std::array<T, size> &arr) {
    // work with arr
}

在处理模板函数时,我们可以引入一个模板值,它可以用来匹配参数的需要。整洁。

我想用通用的 lambda 实现相同的功能,但我做不到。

有没有办法向 lambda 表达式引入类似的推导值,以便任何 std::array s 可以与所述 lambda 一起使用,类似于 foo() 的第二个版本上面的功能?

编辑:如 Evg 的评论所述,我的 vector<auto>语法是非标准的 GCC 扩展。详情见this answer引用this document .

最佳答案

你可以使用一些专用的类型特征:

#include <type_traits>
#include <utility>
#include <array>

template<typename x_Whatever> struct
is_array: ::std::false_type {};

template<typename x_Item, ::std::size_t x_items_count> struct
is_array<::std::array<x_Item, x_items_count>>: ::std::true_type {};

int main()
{
    auto Do_SomethingWithArray
    {
        [](auto & should_be_array)
        {
            static_assert
            (
                is_array
                <
                    ::std::remove_reference_t<decltype(should_be_array)>
                >::value
            );            
        }
    };
    ::std::array<int, 3> a{};
    Do_SomethingWithArray(a); // Ok
    int x{};
    Do_SomethingWithArray(x); // error
}

online compiler

关于c++ - 是否可以使 lambda 签名中的模板变量通用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52910140/

相关文章:

c++ - 友元声明和显式模板实例化声明

java - 检测lambda是否是方法引用

java - 如何将可选<List<A>>转换为可选<List<B>>

c# - 使用 lambda 表达式的嵌套集合创建对象图

c++ - 如何避免多个 deleter lambda?

c++ - 从自然语言到C++表达式

c++ - winsock和新线程不释放内存

c++ - 在自定义类中实例化自定义类时出现 "expected type-specifier"错误

c++ - 如何在 C++ 中为不同的迭代器 value_types 重载函数

c++ - 用于检查给定类型是否存在 istream 运算符 >> 的类型特征