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

时间:2013-02-14 01:44:56

标签: c++

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

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 :: function,我想要一个普通的C ++函数指针。另外,我也看到了这个帖子: demote boost::function to a plain function pointer 前两个解决方案都不会起作用。我的函数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

我不确定这是否可行,但如果确实如此,请告诉:)。

1 个答案:

答案 0 :(得分:2)

使用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");