c++ - 在这种情况下,为什么 std::bind 中需要占位符?

标签 c++ c++11 stdbind

在回答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/

相关文章:

c++ - 将此实例变量添加到 C++11 文件的 header 会使编译器陷入困境。为什么?

c++ - 使用 for 循环绘制边框

C++11 从频繁变化的范围内生成随机数

c++ - Clang:将 bind 或 mem_fn 与 string::c_str 和 transform 结合使用时出现问题

c++ - std::bind 参数复制行为

c++ - std::bind 的返回类型可隐式转换为两个不同的显式构造函数

c++ - 我如何遍历元组

c++ - 结果 vector 错误

c++ - 保存对象的析构函数地址并在以后调用它是否定义明确的行为?

c++ - 结构或类中的数组初始化