【问题标题】:Using parameterized functions c++使用参数化函数 c++
【发布时间】:2012-10-08 08:13:48
【问题描述】:

假设我有一个 C++ 函数

int foo(int x, int y){
   return x+y ;
}

有没有办法创建这个函数的“参数化”版本?

我的意思是,从 foo() 开始,我想定义将 y 固定为特定值的函数指针,相当于像这样创建函数 foo2():

int foo2(int x){
  return foo(x,2);
}

如果不使用函数指针,可以替代具有类似行为吗?

【问题讨论】:

    标签: c++ function function-pointers


    【解决方案1】:

    您可以使用std::bind 修复(或curry)函数参数。

    例如,foo2 可能是

    auto foo2 = std::bind(foo, std::placeholders::_1, 2);
    

    你可以这样理解:

    foo2 的调用类似于对foo 的调用,其中第一个参数是foo2 调用的第一个参数,第二个参数是2

    可以使用 lambda 函数来完成:

    auto foo2 = [] (int x) { return foo(x, 2); }
    

    See the above in action.

    最后,如果您不能使用 C++11,那么还有等效的 boost::bind

    【讨论】:

    • 谢谢。那么我正在寻找的是编程中的“绑定”吗?另外,我想避免使用 boost 库。据您所知,带有 -std=c+11 标志的 g++ 是否支持绑定?
    • @LucaCerone:绑定是您可以使用的一个术语,但如果您正在搜索它,“固定参数”和“柯里化”会更好。 g++ 支持 C++11,因此它确实支持这些解决方案(我已经添加了实时代码的链接)。
    • 感谢 Jon,不幸的是我的编译器还不支持 C++11。 (是gcc 4.6,4.7中已经引入了c++11支持。我会尝试更新,但我不想冒险我的旧程序有问题......)
    • @LucaCerone:对于 C++03,最简单的解决方案是使用 boost::bind,它使用几乎完全相同的语法(您需要指定返回值的类型——使用 @987654336 @ 作为类型,请参阅here 了解更多信息)。或者,您可以按照 tozka 的回答使用标准 C++03 语法,但这仅适用于简单的情况,并且可读性稍差。
    【解决方案2】:

    你可以重载函数

    int foo(int x) {
        return foo(x,2);
    }
    

    你将有相同的名字......或默认参数解决方案......

    【讨论】:

      【解决方案3】:

      函数指针不支持任何类型的东西。事实上,他们所做 所支持的只是指向静态函数。永远不要将它们用于回调,而是使用 std::function 或模板。

      您可以使用std::bind 或 lambda 来实现此目标。但是你不会得到一个函数指针,只有一个函数对象,你可以通过适当的抽象(模板或std::function)来使用它。

      【讨论】:

        【解决方案4】:

        你可以使用 std::bind 例如:

        std::bind2nd (std::ptr_fun (foo), arg2) (arg1) // replace second argument
        std::bind1st (std::ptr_fun (foo), arg1) (arg2) // replace/bind first argument
        

        您也可以将其分配给变量:

        auto fun = std::bind1st (std::ptr_fun (foo), 2);
        auto fun = std::bind2nd (std::ptr_fun (foo), 2);
        

        或者如果你的编译器不支持 C++11

        typedef std::binder1st<std::pointer_to_binary_function<int, int, int>> fun_type;
        fun_type fun = std::bind1st (std::ptr_fun (foo), 2); // foo (2, arg2);
        
        
        typedef std::binder2nd<std::pointer_to_binary_function<int, int, int>> fun_type2;
        fun_type2 fun = std::bind2nd (std::ptr_fun (foo), 2); // foo (arg1, 2);
        

        然后调用它

        fun (arg);
        

        【讨论】:

        • 谢谢@tozka,我觉得你的回答有点难以理解,虽然我可以大致了解..
        猜你喜欢
        • 2017-08-18
        • 1970-01-01
        • 2016-05-03
        • 2020-10-18
        • 1970-01-01
        • 2011-09-14
        • 1970-01-01
        • 2018-05-12
        相关资源
        最近更新 更多