Переопределение методов путем изменения typedef в предке - возможно? - PullRequest
0 голосов
/ 16 марта 2011

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

class Callback
{
    typedef function<void()> Function;
    typedef vector< pair<string, vector<Function>> > CallbackContainer;

public:
    void callback(string); // both types are used

Можно ли изменить аргументы лямбда-функции (тип Function), просто переопределив тип в классах, расширяющих этот?Или код в методе callback использует исходные типы?Если да, могу ли я принудительно использовать новые типы без копирования и вставки кода?Просто чтобы выполнить СУХУ.

1 Ответ

1 голос
/ 16 марта 2011

Типы не виртуальные; вы не можете "переопределить" их в производном классе.

Из моего немного ограниченного понимания того, что вы пытаетесь сделать, я думаю, вы должны сделать Callback шаблоном. Примерно так:

template<typename ArgType>
class Callback
{
    typedef function<void(ArgType)> Function;
    typedef vector< pair<string, vector<Function>> > CallbackContainer;

public:
    void callback(string); // both types are used

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

Может быть, вы могли бы взглянуть на Boost, хотя. Есть большая вероятность, что вы можете использовать что-то, что уже есть, вместо того, чтобы свернуть свое собственное.

...