Наследовать класс с функцией шаблона - PullRequest
3 голосов
/ 19 октября 2010

Я хотел бы создать базовый класс, который будет наследоваться другими объектами, чтобы они могли храниться в том же контейнере.Этот базовый класс будет содержать шаблонный метод, который определяет функцию как установщик или получатель, используемый для доступа к буферу в многопоточной системе.Я хочу сделать что-то, как сделал этот парень, но не совсем уверен, как реализовать Linky .Также я хотел бы иметь возможность иметь виртуальную функцию в базе и определять функциональность в производных классах. Я знаю, что на самом деле у вас не может быть виртуальной шаблонной функции, но есть ли способ ее кодировать таким образом,он действует как концепция функции виртуального шаблона.Ниже приведен грубый пример того, как я хотел бы, чтобы макет был.Метод do_work вызывается через обратный вызов.Обратный вызов передается потоку в качестве аргумента.

class A {
    template<typename R, typename P>
    virtual R do_work(P param) = 0;
}

class B : public A {
    template<void,int> // declare as setter
    R do_work(P param){/*do something*/ return R;}

}

class C : public A {
    template<int,void> // declare as getter
    R do_work(P param){/*do something*/ return R;}

}

Ответы [ 3 ]

1 голос
/ 19 октября 2010

Похоже, у вас проблема с тем, что A является аргументом шаблона do_work в классе A: на самом деле это не имеет смысла.

R не определен нигде в B или C, и ваш синтаксис специализации неверен.

do_work не будет полиморфным, поскольку он не виртуален, поэтому, если у вас есть набор указателей A, он будет вызывать только версию A, но не версию B или C, даже если они лучше соответствуют.

0 голосов
/ 21 октября 2010

Я закончил создавать два вспомогательных класса, потребительский класс и класс производителя, которые наследуют базовый класс. Базовый класс содержит перечисление, определяющее, являются ли производные классы какой функциональностью. Это значение перечисления устанавливается во время вызова конструктора базового класса. Вспомогательные классы содержат соответствующую версию виртуальной функции do_work, которую я хочу (один void с некоторым типом ввода и один с некоторым типом возврата). Когда эти объекты помещаются в контейнер, они преобразуются в базовый класс, а когда они запускаются в соответствующей универсальной рабочей функции потока, они либо преобразуются в класс помощника производителя или класс помощника потребителя.

0 голосов
/ 19 октября 2010

Я целиком и полностью использую шаблонное программирование для эффективности и универсальности, но, возможно, вам следует сначала реализовать это с помощью виртуальных функций.Я считаю полезным, чтобы что-то работало чисто и исправлялось перед написанием шаблонной версии.

Люди, которые здесь могут дать вам лучший ответ, также, если у вас работает не шаблонная функция.

Кроме того, если вы собираетесь вызывать это с помощью обратного вызова или указателя на функцию, вы потеряете тот результат, который, я думаю, вы пытаетесь получить с помощью шаблонного решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...