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

How to include arguments in a function pointer?

本文关键字:包含 参数 指针 函数      更新时间:2023-10-16

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

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

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

例如,我想创建一个函数指针,其中第一个参数始终为 5,以便函数取一个 int 并加 5。另一个第一个参数是 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

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

使用 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

你真正想要的是一个闭包(你可能也想要咖喱化,但C++没有;如果你真的想要它,可以考虑切换到Ocaml)。

C+14 和 C++11 有闭包(但不是 C++ 的早期版本)。阅读有关 lambda 函数(或匿名函数)C++标准 <functional> 标头及其 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 函数指针。它们还包含闭合值(在我的translation示例中d

自动和 decltype 说明符非常有用。例如:

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