Страницы

Поиск по вопросам

пятница, 14 февраля 2020 г.

Использование шаблонов для указания имен методов

#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.

Комментариев нет:

Отправить комментарий