2013-02-14 50 views
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 

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

回答

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"); 
+0

我已经尝试绑定,但就像我说的bind :: boost返回一个boost :: function。我想要的是一个正常的C++函数。 – Toan 2013-02-14 01:48:47

+0

@Toan:新增... – 2013-02-14 01:50:31

+0

感谢您的快速回复。我应该更清楚。我希望参数g(你的例子中的5和9)也是参数。也就是说, void t(int a,int b)返回表达式(g,a,b); //返回一个接受const char的函数* } t(3,5)(“Hello”); // g(“Hello”,3,5); – Toan 2013-02-14 02:01:22

相关问题