带有常用功能和成员功能的函数指针的模板

时间:2014-12-24 10:05:26

标签: c++ templates pointers function-pointers member-function-pointers

我有一个一个函数,它从文件中加载数据,解析它并将这些数据传递给另一个名为“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并为此加载程序编写静态函数包装器?

PS:我找到了完成这项任务的方法,但所有解决方案似乎都很笨拙。我认为我们无法在没有静态功能的情况下应对它......

1 个答案:

答案 0 :(得分:0)

您可以将实例绑定到您的成员函数:

int MyClass::load() {
  load_file("instance_options.txt", std::bind(this, &MyClass::loader));
}

如果你不能使用c ++ 11,请使用boost::bind