在C++中将函数模板作为参数传递

5
例如,我想从两个序列leftright中获取最大值列表,并将结果保存在max_seq中,这些都是事先定义和分配好的。
std::transform(left.begin(), left.end(), right.begin(), max_seq.begin(), &max<int>);

但是这段代码无法编译,因为编译器报错。
 note:   template argument deduction/substitution failed

我知道可以将“std::max”包装在一个structlambda内部。但是是否有一种直接使用std::max而不需要包装的方法?

2个回答

7

std::max有多个重载,因此编译器无法确定你想调用哪一个。使用static_cast进行消歧义,你的代码就能编译通过。

static_cast<int const&(*)(int const&, int const&)>(std::max)

你应该使用lambda表达式。
[](int a, int b){ return std::max(a, b); }

Live demo


@Yakk 嗯,没有它也可以工作。我不知道类型会从转换中推断出来,但当你想到它时,这是有道理的。 - Praetorian
基本上,您正在使用重载解析,它也不需要 <int>。 :) - Yakk - Adam Nevraumont

0
模板的扩展和实例化发生在编译时。因此,你只能将模板函数传递给模板。
你可以在运行时传递一个实例化(模板化)的函数(那时它就是一个“普通”的C++函数)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接