在回答this question时,我偶然看到以下事实。
请参阅此示例:
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
为什么?我仅绑定(bind)第一个参数。std::bind
是否不可能自动“占位”其他参数? (我期望 C++98 中的 std::bind1st
得到相同的结果。)为什么??
最佳答案
一般来说使用bind
时这是不可能的,因为func1
可能有默认参数,或者使用不同数量的参数重载,或者可能是一个仿函数,其 operator()
是一个带有参数包的函数模板。
在这种情况下,有许多不同的方法来调用func1
。我认为 bind
选择一个并用占位符填充空白是不可取的。
在您的示例中,它是明确的,但我不确定确定明确的情况是什么、用代码准确地检测它们并在标准中准确地定义它们有多容易。
bind1st
在设计上是明确的,因为它专门用于绑定(bind) 2 参数仿函数的第一个参数。
关于c++ - 在这种情况下,为什么 std::bind 中需要占位符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22934338/