Я написал простую программу C++, чтобы принять обратный вызов.
Какой обратный вызов? обратный вызов является вторым аргументом основной функции и он просто возвращает строку, эта строка затем вставляется в файл.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"));
}
Printer("exampleText")
передается неправильно. Второй аргумент функции WriteToFile
принимает указатель на функцию. Так что просто передайте функцию Printer
.
Аргумент для переданного указателя функции должен быть отправлен как другой аргумент.
Что-то like-
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");
WriteToFile
ожидает, что второй аргумент будет указателем функции, а не результатом вызова функции. Измените вызов так, чтобы он выглядел следующим образом:
WriteToFile("test.txt", Printer);
Тем не менее, это не имеет большого смысла, потому что &f
является адресом функции, поэтому он просто печатает какое-либо шестнадцатеричное значение. Вероятно, вы хотите вызвать указатель функции:
FileProcessor << (*f)("exampleText") << endl;
Для передачи аргумента у вас есть два варианта. Vinayak Garg перечислил один, который должен добавить третий аргумент в WriteToFile
. Другой - использовать std::bind
.
WriteToFile("test.txt", std::bind(&Printer, "exampleText"));
В последнем случае это будет не так, как будто он принимает аргумент. Ваше определение WriteToFile
должно выглядеть так (untested):
void WriteToFile(string filename, const std::function<string()> &f )
{
...
FileProcessor << f() << endl;
}