是否可以在lambda签名通用中创建模板变量?

Fur*_*ish 5 c++ lambda templates generic-lambda c++17

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

template<typename T>
void foo(std::vector<T> &vec) {
    // work with vec
}
Run Code Online (Sandbox Code Playgroud)

因为C++14,我们能够用lambdas实现同样的目标.在这种情况下,我们将它们称为通用lambdas,因为我们为它们引入了类似模板的推导:

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

但我们的选择似乎对我很有限.假设我不仅要引入类型推导,还需要引入模板值.例如,让我们std::vector改为std::array:

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

在处理模板函数时,我们可以引入一个模板值,可以用来匹配参数的需求.整齐.

我想用通用lambda实现相同的功能,但我无法这样做.

有没有办法将一个类似的推导值引入lambda表达式,这样任何std::arrays都可以与lambda一起使用,类似于foo()上面函数的第二个版本?

编辑:正如Evg的评论所述,我的vector<auto>语法是非标准的GCC扩展.有关详情请参阅此答案参照这个文件.

use*_*670 5

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

#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
}
Run Code Online (Sandbox Code Playgroud)

在线编译器