我想做以下事情。说我有这个:
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
我不确定这是否可行,但如果确实如此,请告诉:)。
答案 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");