将函数/ lambda /类与重载()作为参数的函数

时间:2019-05-09 18:21:22

标签: c++ function comparator functor

我需要编写一个函数,该函数可以将带有()运算符的另一个函数/ lambda /类作为参数重载并正确使用它们(例如std :: sort的第3个arg)。 就C ++语法而言,是什么样子?

2 个答案:

答案 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;
}
相关问题