【发布时间】:2021-10-03 22:01:28
【问题描述】:
我确实希望能够在不声明 lambda 的情况下使用 extFunction 或 std::max 或 std::min 作为 square 方法的参数:
template<typename T>
T extFunction(T a, T b)
{
return a;
}
class Stuff
{
public:
template <typename F>
int square(int num, int num2, F&& func)
{
return func(num, num2);
}
};
int main()
{
Stuff s;
std::cout << s.square(1, 2, std::max<int>) << std::endl;
return 0;
}
但是编译器 (gcc 11.1) 告诉我:
函数不明确:“无法推断模板参数'
F'”
有没有一种简单的方法可以在没有 lambda 的情况下做到这一点?
编辑:
也许展示如何使用 lambdas 做到这一点会很有趣:
std::cout << s.square(1,2,[](auto&& a, auto&& b){return std::max(a,b);}) << std::endl;
std::cout << s.square(1,2,[](auto&& a, auto&& b){return std::min(a,b);}) << std::endl;
std::cout << s.square(1,2,[](auto&& a, auto&& b){return extFunction(a,b);}) << std::endl;
输出:
Program returned: 0
Program stdout
2
1
1
【问题讨论】:
-
std::max<int>有几个重载,const int&(*)(const int&, const int&)和int (*) (std::initializer_list<int>)。 -
为什么要这样做?是好奇还是潜意识的要求?
-
@JeffGarrett 我有两种算法要执行,它们是相同的,除了一个需要一组值的最大值,另一个需要最小值。显然我不想把算法写两次,因为区别只是调用一个函数或另一个。
标签: c++ templates lambda function-pointers function-templates