c++ - 我可以绑定(bind)到采用默认参数的函数然后调用它吗?

标签 c++ c++11 bind default-arguments

如何绑定(bind)到采用默认参数的函数,而不指定默认参数,然后在没有任何参数的情况下调用它?

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, 23);。它仅在您实际使用函数名称直接调用时才有效。例如,您不能将 &foo 分配给 void(*)(int),因为函数的签名是 void(int, int)。默认参数在签名中不起作用。如果将其分配给 void(*)(int, int) 变量,则有关默认参数的信息将丢失:您无法通过该变量利用默认参数。 std::bind 在其内部某处存储了一个 void(*)(int, int),因此丢失了默认参数信息。

在 C++ 中无法从函数外部获取参数的默认值,因此您只能在绑定(bind)时手动提供默认值。

关于c++ - 我可以绑定(bind)到采用默认参数的函数然后调用它吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10718994/

相关文章:

c++ - 如何使用 Boost.Python 将 C++ 对象传递给另一个 C++ 对象

c++ - 使用 C++ 在 vi​​sual studio 中进行套接字编程

c++ - union Initializer "error: expected primary-expression before ‘.’ token ”

c++ - 如何使用 cpp 设置随机数生成器的语法?

c++ - g++ 7.1.1 中的可变参数模板部分特化 "not more specialised"

c++ - 重载模板化类二元运算符*

PHP OCI_BIND_BY_NAME 不起作用

jquery - 解除div的绑定(bind),稍后再绑定(bind)

c++ - WIN32 在哪里定义,我如何在我的项目中包含这个定义?

c++11 - Arduino 1.6.9/1.610 构建失败,出现 "' constexprint' 未命名类型”