#cpp #классы #шаблоны_с++ #методы
Подскажите как более правильно и красиво реализовать следующую задумку:
Есть некоторый класс CTasksManager, у которого есть публичный метод CTasksManager::start,
который подготавливает данные и запускает потоки, в каждом из которых используется
приватный метод methodN (method1, method2, ..., methodN).
Иногда мне требуется, чтобы start работал с одним методом, иногда с другим. Но всегда
с одним и тем же в процессе выполнения программы (т.е. не динамический выбор метода).
Заходить в нужный файл и править один вызов на другой - это некрасиво и вообще детский
сад :), поэтому мне кажется, что лучшее решение - использование шаблонов, например так:
class CTasksManager
{
private:
void method1();
void method2();
public:
void start();
};
Т.е. чтобы вызовы можно было бы делать так:
CTasksManager tasksManager;
tasksManager.start();
...
tasksManager.start();
Можно ли это реализовать силами стандартного C++ (без буста) и если да, то как?
Может есть более правильный способ?
Ответы
Ответ 1
Для этого можно обойтись без шаблонов, передавая указатель на метод (причем метод должен стать публичным): class CTasksManager { public: void method1(); void method2(); using t_PointerToMethod = void ( CTasksManager::* )(void); void start(t_PointerToMethod const p_method) { return (this->*p_method)(); } }; tasksManager.start(&CTasksManager::method1);Ответ 2
Вам нужно нечто похожее на std::launch. Посмотрите, как используется данное перечисление с std::async.
Комментариев нет:
Отправить комментарий