0

У меня есть функция, которая загружает данные из файла, анализирует и передает эти данные другой функции под названием «загрузчик». Она ставит эти разобранный данные в глобальные переменные или член класса:Шаблон с указателем функции на обычную функцию и функцию-член

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: Я выяснил способы выполнения этой задачи, но все решения кажутся неуклюжими. Я думаю, что мы не можем справиться с ней без статических функций ...

ответ

0

Вы можете связать свой экземпляр вашей функции члена:

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

Если вы не можете использовать с использованием ++ 11 boost::bind

+0

Как это сделать без использования C++ 11 и boost? –

+0

@nirname Вам нужно создать новый объект, который хранит ваш экземпляр в качестве члена и перегружает его 'operator()', который затем вызывает функцию 'loader' члена хранимого экземпляра :) – Drax

+0

Возможно ли это сделать с заголовком ? –