2013-02-14 49 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

相關問題