2

在回答这个问题时,我偶然看到了以下事实。

请看这个例子:

void func1(const char *str1, const char *str2) { puts(str1); puts(str2); }
...

auto fn = std::bind(func1, "asdf");
fn("1234");

编译失败:

prog.cpp: In function ‘int main()’:
prog.cpp:11:14: error: no match for call to ‘(std::_Bind<void (*(const char*))(const char*, const char*)>) (const char [5])’
     fn("1234");
              ^

如果我将代码更改为此,它工作得很好:

    auto fn = std::bind(func1, "asdf", _1);

输出是:

asdf
1234

为什么?我只绑定std::bind第一个参数..自动“占位符”其他参数是不可能的吗?(我期望std::bind1st在 C++98 中得到相同的结果。)为什么?

4

1 回答 1

3

通常在使用bind它时是不可能的,因为func1可能有默认参数,或者具有不同数量的参数的重载,或者可能是一个函子,其operator()是一个接受参数包的函数模板。

在这种情况下,有许多不同的调用方式func1bind我认为选择一个并用占位符填充空白是不可取的。

在您的示例中,它是明确的,但我不确定确定明确的案例是多么容易,用代码准确地检测它们,并在标准中准确地定义它们。

bind1st在设计上是明确的,因为它专门用于绑定 2 参数仿函数的第一个参数。

于 2014-04-08T10:38:18.843 回答