0

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

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

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

4

1 回答 1

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");
于 2013-02-14T01:47:05.043 回答