从另一个函数创建一个函数(参数较少)

Creating a function (of fewer parameters) from another function

本文关键字:函数 一个 参数 另一个 创建      更新时间:2023-10-16

我想做以下事情。假设我有这个:

void f(const char* c) {
    // Do stuff with c
}
void g(const char* c, int x, int y) {
    // Do other stuff
}

我想做的是从g中创建一个函数,它使用const char*c。这就是:

int a = 5;
int b = 9;
expression(g, a, b)("Hi!");

优选地,expression(g)也可以存储在变量中。我也不知道如何声明这个变量。

我尝试过使用boost::bind;但是boost::bind返回一个boost::函数,我想要一个普通的C++函数指针。此外,我还看到了这条线索:将boost::函数降级为普通函数指针前两种解决方案都不起作用。我的函数f被约束为接受一个参数(没有void*user_data指针)。我需要这个的原因是我有第三个函数h,它接受一个参数的函数,即const char*,并用它做事情。我希望能够以g的形式传递给h。

h(f) // Valid
h(expression(g, a, b)) // Would like for this to be valid, too

我不确定这是否可能,但如果可能,一定要告诉:)。

使用bind:

#include <functional>
auto h = std::bind(g, std::placeholders::_1, 5, 9);
h("hi");

bind会复制参数,所以如果您计划通过引用获取参数,请小心(在这种情况下,您可能需要std::ref)。尽量保持结果类型auto,以避免不必要的转换。


要获得一个正常的C++函数:

void h(char const * s) { g(s, 5, 9); }

或者:

void (*ph)(char const *) = [](const char * s) { g(s, 5, 9); };

或者对于疯子:

struct Foo { static void bar(char const * s) { g(s, 5, 9); } };
void (*qh)(char const *) = &Foo::bar;

用法:

h("hi");
ph("hi");
Foo::bar("hi");
qh("hi");
相关文章: