以 function/lambda/class 和 overloaded() 作为参数的函数
Function which takes function/lambda/class with overloaded() as argument
我需要编写一个函数,它可以将另一个 function/lambda/class 和 () 运算符作为参数重载并正确地使用它们(比如 std::sort 的第 3 个参数)。
它在 C++ 语法方面是什么样子的?
对于函数参数,正如@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;
}
但是,有些情况下您不能使用模板(例如主函数中的函数参数)。
对于这些情况,函数变量看起来像 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 - 可以是 int/double...
ret_val - 函数的 return 值类型
示例:
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;
}
您可以使用您认为可调用的模板参数使其成为函数模板(如 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.
我需要编写一个函数,它可以将另一个 function/lambda/class 和 () 运算符作为参数重载并正确地使用它们(比如 std::sort 的第 3 个参数)。 它在 C++ 语法方面是什么样子的?
对于函数参数,正如@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;
}
但是,有些情况下您不能使用模板(例如主函数中的函数参数)。 对于这些情况,函数变量看起来像 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 - 可以是 int/double...
ret_val - 函数的 return 值类型
示例:
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;
}
您可以使用您认为可调用的模板参数使其成为函数模板(如 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.