gpt4 book ai didi

c++ - 使用运行时常量实例化的函数模板

转载 作者:搜寻专家 更新时间:2023-10-31 02:03:31 26 4
gpt4 key购买 nike

我需要一些方法来结合 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';
}

关于c++ - 使用运行时常量实例化的函数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55334856/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com