我需要编写一个函数,该函数可以将带有()运算符的另一个函数/ lambda /类作为参数重载并正确使用它们(例如std :: sort的第3个arg)。 就C ++语法而言,是什么样子?
答案 0 :(得分:1)
您可以使用假定为可调用的模板参数,使其成为功能模板(例如std::sort
)
template<typename Func>
void myFunction(Func f)
{
f();
}
现在让我们对其进行测试:
void normalFunction()
{
std::cout << "Normal function.\n";
}
struct Functor {
void operator()()
{
std::cout << "Functor object.\n";
}
};
int main()
{
Functor functor;
myFunction(normalFunction);
myFunction(functor);
myFunction([]{ std::cout << "Lambda.\n"; });
}
这将打印:
Normal function. Functor object. Lambda.
答案 1 :(得分:-1)
对于函数参数,如@NathanOliver所述,最好将模板参数用作函数:
template<typename CompFunc>
int myfunction(CompFunc func, int a, int b) {
return func(a, b) + 20;
}
float comp(double a, double b) {
return (float)(b - a);
}
int main() {
cout << myfunction(comp, 1, 2); // Prints: 21
return 0;
}
但是,在某些情况下,您不能使用模板(例如,主函数中的function参数)。 在这种情况下,函数变量类似于C:
ret_val (*function_parameter_name) (func_param_type1, func_param_type2, ..);
在C ++中看起来像这样:
std::function<ret_val(func_param_type1, func_param_type2, ..)> function_parameter_name;
function_parameter_name -您将使用它:function_parameter_name(p1, p2); // Call the function
func_param_typeX -可以为整数/双精度值...
ret_val -函数的返回值类型
示例:
float comp(double a, double b) {
return (float)(b - a);
}
int main() {
std::function<float(double, double)> my_comp;
std::cout << my_comp(5.2, 3.9) << std::endl;
return 0;
}