У меня есть функция, которая загружает данные из файла, анализирует и передает эти данные другой функции под названием «загрузчик». Она ставит эти разобранный данные в глобальные переменные или член класса:Шаблон с указателем функции на обычную функцию и функцию-член
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: Я выяснил способы выполнения этой задачи, но все решения кажутся неуклюжими. Я думаю, что мы не можем справиться с ней без статических функций ...
Как это сделать без использования C++ 11 и boost? –
@nirname Вам нужно создать новый объект, который хранит ваш экземпляр в качестве члена и перегружает его 'operator()', который затем вызывает функцию 'loader' члена хранимого экземпляра :) – Drax
Возможно ли это сделать с заголовком ? –