我有一个一个函数,它从文件中加载数据,解析它并将这些数据传递给另一个名为“loader'”的函数。它将数据解析为全局变量或类成员 :
class ParsedData;
template<typename Loader>
int load_file(std::string file_path, Loader loader) {
ParsedData parsed_data;
try {
ParsedData parsed_data = parse_file(file_path);
return loader(parsed_data);
} catch(...) {
// doing some stuff, handling exceptions and so on
return 1;
}
}
在某个地方我定义了2个不同的加载器:
int loader();
int MyClass::loader();
然后我想用它:
int load() {
load_file("global_options.txt", loader);
}
int MyClass::load() {
load_file("instance_options.txt", loader);
}
int main() {
load(); // load global options
MyClass my_class_instance;
my_class_instance.load(); // load instance options
}
模板实例化没问题,但调用 loader
的语法不同。我很清楚我有编译错误:must use ‘.*’ or ‘->*’ to call pointer-to-member function
。我应该写在load_file
中的某处:
return my_class_instance_ptr->*loader(parsed_data);
是否可以绕过此限制,或者是否应该将实例指针传递给load_file
并为此加载程序编写静态函数包装器?
答案 0 :(得分:0)
您可以将实例绑定到您的成员函数:
int MyClass::load() {
load_file("instance_options.txt", std::bind(this, &MyClass::loader));
}
如果你不能使用c ++ 11,请使用boost::bind