当没有占位符编码时,std :: function仍然需要参数

时间:2016-06-26 04:53:47

标签: c++11 functional-programming function-pointers

我想知道我在这里做错了什么。这是我的代码示例。它只是一个粗略的代码示例,描述了函数指针的使用。在下面的例子中,函数指针接受一个参数。但是在函数指针赋值期间已经分配了该参数。现在为了调用函数指针我还需要提供一个参数值虽然该值是使用的(除非我使用std :: placeholder)。我的问题是我如何调用一个需要参数的函数指针,并且已经分配了参数而没有传入参数。

#include <iostream>
#include <functional>

using namespace std;

std::function<std::string(std::string)> fptr;

std::string foo()
{
    return fptr();  //--->statement A - I need to invoke this funct ptr without passing a parameter as a parameter has already been assigned in statement B 
}

std::string bar(std::string p)
{
    return p;
}

int main()
{
  fptr = std::bind(&bar,"Hello");  --->statement B
  std::cout << foo();
}

std::bind中的注意事项我没有使用任何占位符和&#34;您好&#34;是函数bar的参数。我的问题是为什么

return fptr();

不行。如果我做以下

return fptr("Bye");

它起作用并返回&#34;你好&#34; 。 (在fptr调用期间没有传递参数的点)为什么没有参数它不起作用?

1 个答案:

答案 0 :(得分:3)

std::bind的结果允许您传递超出其需要的参数,并忽略这些额外的参数。在您的情况下,std::bind(&bar, "Hello")可以不带参数调用,或者由fptr声明,只有一个std::string参数。

您的问题的解决方案很简单,只需将fptr的类型更改为std::function<std::string()>,它不接受任何参数并返回字符串。