【问题标题】:Function which takes function/lambda/class with overloaded() as argument [closed]将带有重载()的函数/ lambda /类作为参数的函数[关闭]
【发布时间】:2019-05-09 18:21:21
【问题描述】:

我需要编写一个函数,它可以采用另一个函数/lambda/类,并将 () 运算符重载为参数并正确使用它们(如 std::sort 的第 3 个参数。 它在 C++ 语法方面是什么样的?

【问题讨论】:

  • 好的...您是否查看了std::sort 的定义并复制它?
  • 它通常作为std::function,如果你的函数不能成为模板,或者是仿函数类型的模板。
  • 是的,我看过,但很难理解这种编码风格-_-
  • @RayZieger 只需将可调用对象作为模板参数即可。
  • template< class RandomIt, class Compare > void sort( RandomIt first, RandomIt last, Compare comp ); 有什么不明白的地方?

标签: c++ function comparator functor


【解决方案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"; });
}

这将打印:

正常功能。 函子对象。 拉姆达。

【讨论】:

    【解决方案2】:

    对于函数参数,正如@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 - 函数的返回值类型


    示例

    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::function 在界面中通常是矫枉过正。模板允许您获取可调用对象,而无需使用 std::function 使用的昂贵类型擦除。
    • @NathanOliver 你说得对,已修复,谢谢。
    • 在 c++ 中调用 std::function 函数的“一般”表示相当具有误导性
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    • 2011-12-27
    • 2021-08-30
    相关资源
    最近更新 更多