我需要某种方法来结合lambda捕获运行时值的能力和函数模板指定我们想要的任何类型的能力。最好的方法是什么?
Lambda 允许我们在运行时捕获局部变量的值,例如
unsigned char c=0;
auto compareEquality=[c](unsigned char c1) ->bool {return c1==c;};
..
scanner(compareEquality);
因此,scanner
传递了一个嵌入了运行时确定值 0 的函数,并且在scanner
内部我们调用compareEquality
传递它一个unsigned char
,以与 0 或运行时获得的任何其他值进行比较。但我也希望参数是我想要的任何类型的,而不仅仅是unsigned char
.有这个会很好:
template<typename T>
bool compareEquality(T data) {
return ( data== c);//error, what is 'c'?
}
但是使用函数模板,我无法在其中嵌入运行时常量,而只能像这样传递函数:
scanner(compareEquality);
上面的代码不允许我指定在函数中比较什么值。
将函数模板和 lambda 捕获结合起来的最佳方式是什么,以便compareEquality
可以使用一些嵌入式运行时值传递,而我们不必定义接受不同参数类型的单独版本。
我可能误解了你的问题,但你可以写一个高阶函数来返回一个 lambda:
#include <iostream>
#include <vector>
#include <algorithm>
template <typename T>
constexpr auto is_equal_to(T value)
{
return [value](T const& x) { return x == value; };
}
int main(void)
{
std::vector src {17, 4, 42, 23, 9, 17, 8, 61};
int x;
std::cin >> x;
std::cout << "count (" << x << "): "
<< std::count_if(src.cbegin(), src.cend(), is_equal_to(x)) << 'n';
std::cout << "count (42): "
<< std::count_if(src.cbegin(), src.cend(), is_equal_to(42)) << 'n';
}
你可以做的是有一个函数为你构建这些lambda,如下所示:
template<typename T>
auto ret_f(const T& p){
return [p](const T& p1)-> bool
{return p1==p;};
}
struct foo{
int a;
double b;
bool c;
bool operator==(const foo& f){
return false;
}
};
int main() {
unsigned char c= 0;
int i = 0;
foo bar {22,15.2,false};
auto fchar = ret_f(c);
auto fint = ret_f(i);
auto f_foo = ret_f(bar);
cout<<fchar('a');
cout<<fint(2.6);
cout<<f_foo(bar);
return 0;
这样,您只需使用正确的参数调用ret_f
,并返回正确的 lambda。