[英]Can I bind to a function that takes default arguments and then call it?
如何綁定到接受默認參數的函數,而不指定默認參數,然后在沒有任何參數的情況下調用它?
void foo(int a, int b = 23) {
std::cout << a << " " << b << std::endl;
}
int main() {
auto f = std::bind(foo, 23, 34); // works
f();
auto g = std::bind(foo, 23); // doesn't work
g();
using std::placeholders::_1;
auto h = std::bind(foo, 23, _1); // doesn't work either
h();
}
基本上, foo(x)
編寫foo(x)
,編譯器都會將其轉換為foo(x, 23);
。 它只適用於您實際使用函數名稱直接調用的情況。 例如,你不能將&foo
賦給void(*)(int)
,因為函數的簽名是void(int, int)
。 默認參數不參與簽名。 如果將其分配給void(*)(int, int)
變量,則有關默認參數的信息將丟失:您無法通過該變量利用默認參數。 std::bind
在其內部的某處存儲void(*)(int, int)
,因此丟失了默認參數信息。
C ++中沒有辦法從函數外部獲取參數的默認值,因此在綁定時手動提供默認值時會遇到困難。
我想你可以使用lambda來模擬你想要的行為。
有點像這樣:
auto g = [] (){ foo( 23 ); };
編輯:剛檢查,似乎工作正常: http : //ideone.com/SPSvi
我有兩個解決方案:
1 - 您可以重載foo()並讓它使用默認值調用原始文件:
void foo(int a, int b)
{
std::cout << a << " " << b << std::endl;
}
inline void foo(int a)
{
foo(a, 23);
}
2 - 您可以使用靜態變量作為默認值,然后在綁定過程中使用它:
static int foo_default_b = 23;
void foo(int a, int b = foo_default_b)
{
std::cout << a << " " << b << std::endl;
}
auto g = std::bind(foo, 23, foo_default_b);
g();
這個答案不同意R. Martinho Fernandes的回答。 你確實可以使用boost::bind
綁定到默認參數,你只需要放置占位符,如下所示:
boost::bind<void (int, int)>(foo, _1, _2)(12);
這將按預期調用foo(12, 23)
。 雖然我沒有測試這個特定的代碼,但是我在代碼中基於上面鏈接的答案做了類似的事情,並且它在gcc 4.8.5
。
嗯,我剛剛注意到這是在詢問std::bind
,而不是boost::bind
。 我不知道有什么不同,如果有的話。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.