假设您有一个接受 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::vector
至 std::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
}
关于c++ - 是否可以使 lambda 签名中的模板变量通用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52910140/