說我有一個C++函數使用參數化功能C++
int foo(int x, int y){
return x+y ;
}
有沒有一種方法來創建此功能的「參數」的版本?
我的意思是,從FOO()開始,我想定義具有對Y固定到一個特定的值,創建函數foo2的(相當於函數指針)是這樣的:
int foo2(int x){
return foo(x,2);
}
如果而不是函數指針,它可以替代具有類似的行爲?
說我有一個C++函數使用參數化功能C++
int foo(int x, int y){
return x+y ;
}
有沒有一種方法來創建此功能的「參數」的版本?
我的意思是,從FOO()開始,我想定義具有對Y固定到一個特定的值,創建函數foo2的(相當於函數指針)是這樣的:
int foo2(int x){
return foo(x,2);
}
如果而不是函數指針,它可以替代具有類似的行爲?
例如,foo2
可能是
auto foo2 = std::bind(foo, std::placeholders::_1, 2);
你可以看這是:
到foo2
的調用是喜歡foo
調用其中第一個參數是第一個參數foo2
呼叫,第二個參數是2
。
的可以用一個lambda函數來完成:
auto foo2 = [] (int x) { return foo(x, 2); }
最後,如果你不能使用C++ 11,那麼就有相當於boost::bind
。
謝謝。那麼我在尋找什麼在編程中被稱爲「綁定」?另外,我想避免增強庫。 你知道g ++與-std = c + 11標誌支持綁定嗎? – lucacerone
@LucaCerone:綁定是你可以使用的一個術語,但是如果你正在尋找它,「固定參數」和「柯里」更好。 g ++支持C++ 11,所以它支持這些解決方案(我已經添加了一個鏈接到實時代碼)。 – Jon
感謝Jon,不幸的是我的編譯器還不支持C++ 11。 (這是gcc 4.6,C++ 11的支持已經在4.7中介紹過了..我會盡力更新,但我不想冒我的舊程序有問題......) – lucacerone
您可以
int foo(int x) {
return foo(x,2);
}
重載函數,你將有相同的名字......或者默認參數的解決方案...
函數指針不支持這種事。實際上,他們所有的做的都支持指向靜態函數。千萬不要使用它們進行回調,請使用std::function
代替或使用模板。
您可以使用std::bind
或lambda來實現此目標。但是你不會得到一個函數指針,只有一個函數對象,你可以通過適當的抽象(模板或std::function
)使用它。
您可以使用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);
謝謝@tozka,我覺得你的回答有點難以遵循,儘管我可以得到一般想法.. – lucacerone
std :: bind/boost :: bind? – ForEveR