以 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.