2012-10-08 42 views
2

說我有一個C++函數使用參數化功能C++

int foo(int x, int y){ 
    return x+y ; 
} 

有沒有一種方法來創建此功能的「參數」的版本?

我的意思是,從FOO()開始,我想定義具有對Y固定到一個特定的值,創建函數foo2的(相當於函數指針)是這樣的:

int foo2(int x){ 
    return foo(x,2); 
} 

如果而不是函數指針,它可以替代具有類似的行爲?

+0

std :: bind/boost :: bind? – ForEveR

回答

6

您可以使用std::bind修復(或curry)函數參數。

例如,foo2可能是

auto foo2 = std::bind(foo, std::placeholders::_1, 2); 

你可以看這是:

foo2的調用是喜歡foo調用其中第一個參數是第一個參數foo2呼叫,第二個參數是2

的可以用一個lambda函數來完成:

auto foo2 = [] (int x) { return foo(x, 2); } 

See the above in action

最後,如果你不能使用C++ 11,那麼就有相當於boost::bind

+0

謝謝。那麼我在尋找什麼在編程中被稱爲「綁定」?另外,我想避免增強庫。 你知道g ++與-std = c + 11標誌支持綁定嗎? – lucacerone

+0

@LucaCerone:綁定是你可以使用的一個術語,但是如果你正在尋找它,「固定參數」和「柯里」更好。 g ++支持C++ 11,所以它支持這些解決方案(我已經添加了一個鏈接到實時代碼)。 – Jon

+0

感謝Jon,不幸的是我的編譯器還不支持C++ 11。 (這是gcc 4.6,C++ 11的支持已經在4.7中介紹過了..我會盡力更新,但我不想冒我的舊程序有問題......) – lucacerone

0

您可以

int foo(int x) { 
    return foo(x,2); 
} 

重載函數,你將有相同的名字......或者默認參數的解決方案...

0

函數指針不支持這種事。實際上,他們所有的做的都支持指向靜態函數。千萬不要使用它們進行回調,請使用std::function代替或使用模板。

您可以使用std::bind或lambda來實現此目標。但是你不會得到一個函數指針,只有一個函數對象,你可以通過適當的抽象(模板或std::function)使用它。

0

您可以使用std ::綁定例如:

std::bind2nd (std::ptr_fun (foo), arg2) (arg1) // replace second argument 
std::bind1st (std::ptr_fun (foo), arg1) (arg2) // replace/bind first argument 

你也可以把它分配給變量:

auto fun = std::bind1st (std::ptr_fun (foo), 2); 
auto fun = std::bind2nd (std::ptr_fun (foo), 2); 

,或者如果你的編譯器不支持C++ 11

typedef std::binder1st<std::pointer_to_binary_function<int, int, int>> fun_type; 
fun_type fun = std::bind1st (std::ptr_fun (foo), 2); // foo (2, arg2); 


typedef std::binder2nd<std::pointer_to_binary_function<int, int, int>> fun_type2; 
fun_type2 fun = std::bind2nd (std::ptr_fun (foo), 2); // foo (arg1, 2); 

然後叫它

fun (arg); 
+0

謝謝@tozka,我覺得你的回答有點難以遵循,儘管我可以得到一般想法.. – lucacerone