簡體   English   中英

我可以綁定到一個接受默認參數然后調用它的函數嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM