【问题标题】:How to include arguments in a function pointer?如何在函数指针中包含参数?
【发布时间】:2015-03-11 09:19:31
【问题描述】:

如何在函数指针中包含参数?

这段代码创建了一个可以添加两个整数的函数指针:

int addInt(int n, int m) {
    return n+m;
}
int (*functionPtr)(int,int);
functionPtr = addInt;
(*functionPtr)(3,5); // = 8

例如,我想创建一个第一个参数始终为 5 的函数指针,以便该函数接受一个 int 并添加五个。还有一个第一个参数是 8。

这可以使用addInt 吗?比如:

// make-believe code that of course won't work 
int (*functionPtr)(int);
functionPtr = addInt(5);
(*functionPtr)(3); // = 8
(*functionPtr)(9); // = 14

【问题讨论】:

  • 你不能,无论如何不能使用函数指针。但是,您可以使用 std::bind 来执行此操作。
  • 如果你要向某个东西添加值,为什么还需要一个函数指针?顺便说一句,函数没有默认值,只有构造函数
  • @Pandrei 这是一个小例子,不是我的实际问题
  • @Anna:您可能应该询问您的实际问题,并且您当然应该提及您是否使用 C++11、C++14 或某些旧版本的 C++ 标准进行编码。

标签: c++ function-pointers


【解决方案1】:

像这样使用std::bind

using namespace std::placeholders;
auto f = std::bind(addInt, 5, _1);

f(1); //returns 6

【讨论】:

    【解决方案2】:

    使用 std::bind 和占位符

    #include <iostream>
    #include <functional>
    
    using namespace std;
    
    int addInt(int n, int m) {
        return n+m;
    }
    
    int main() {
        int (*functionPtr)(int,int);
        functionPtr = addInt;
        (*functionPtr)(3,5); // = 8
        auto f2 = std::bind( addInt, std::placeholders::_1, 5);
        auto f3 = std::bind( addInt, 8, std::placeholders::_1);
        std::cout << f2(1) << "\n";;
        std::cout << f3(1) << "\n";;
    }
    

    输出:
    6
    9

    【讨论】:

      【解决方案3】:

      您真正想要的是 closure(您可能还想要 curryfication,但 C++ 没有;如果您真的想要,请考虑切换到 Ocaml)。

      C+14C++11 有闭包(但不是早期版本的 C++)。阅读 C++ lambda functions(或匿名函数)和标准 &lt;functional&gt; 标头及其 std::function 模板。

      这是给定整数 d 的函数返回 d 的翻译,即该函数采用整数 x 并返回 x+d

      #include <functional>
      std::function<int(int)> translation(int d) {
        return [=](int x) { return addInt(x,d) /* or x+d */ ; };
      }
      

      注意std::function-s 只是 C 函数指针。它们还包含封闭值(d 在我的 translation 示例中)

      autodecltype 说明符非常有用。 例如:

      auto addfive = translation(5);
      std::cout << addfive(3) << std::end; // should output 8
      

      【讨论】:

      • 我认为使用auto 而不是std::function&lt;int(int)&gt; 会更好,至少如果您可以将它分配到您这样声明的位置。
      • @Hunkyl:你确定吗?我相信对于新手来说,显式 std::function 更具可读性!
      猜你喜欢
      • 2021-05-10
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 2017-10-18
      • 2017-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多