C ++回调函数问题

时间:2014-06-23 09:29:56

标签: c++

我编写了一个简单的C ++程序来接受回调。

回调是做什么的?回调是main函数的第二个参数,它只返回一个字符串,然后该字符串由main函数插入到.txt文件中。

错误是什么? Visual Studio 2013会抛出此错误:

error C2664: 'void WriteToFile(std::string,std::string (__cdecl *)(std::string))' : cannot convert argument 2 from 'std::string' to 'std::string (__cdecl *)(std::string)'

以下是代码

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

void WriteToFile(string filename, string (*f)(string) )
{
    ofstream FileProcessor;

    FileProcessor.open(filename, ios::app);

    FileProcessor << &f << endl;

}

string Printer(string Content)
{
    return Content;
}

int main()
{

    WriteToFile("test.txt", Printer("exampleText"));


}

2 个答案:

答案 0 :(得分:1)

WriteToFile期望第二个参数是函数指针,而不是函数调用的结果。将呼叫更改为如下所示:

WriteToFile("test.txt", Printer);

但是,它没有多大意义,因为&f是函数的地址,所以它只打印一些十六进制值。您可能想要调用函数指针:

FileProcessor << (*f)("exampleText") << endl;

要传递参数,您有两个选择。 Vinayak Garg列出了一个,即向WriteToFile添加第三个参数。另一个是使用std::bind

WriteToFile("test.txt", std::bind(&Printer, "exampleText"));

在后一种情况下,它看起来不像是需要参数。您对WriteToFile的定义应如下所示(未经测试):

void WriteToFile(string filename, const std::function<string()> &f )
{
    ...
    FileProcessor << f() << endl;
}

答案 1 :(得分:1)

AFAIK Printer("exampleText")传递错误。函数WriteToFile的第二个参数接受指向函数的指针。所以只需传递函数Printer

传递的函数指针的参数应该作为不同的参数发送。

像 -

void WriteToFile(string filename, string (*f)(string), string mystring )
{
    ofstream FileProcessor;

    FileProcessor.open(filename, ios::app);

    FileProcessor << f(mystring) << endl;

}

然后调用

WriteToFile("test.txt", Printer, "exampleText");