Обойти ограничения шаблонов Qt

Я хочу написать простой гибкий ftp-сервер на C ++, который можно параметризовать с помощью класса для обработки пользователя (проверка логина и пароля, доставка файлов и т. Д.), Предоставляемых при инициализации сервера.

Итак, я придумал эту аккуратную (так я думал) идею:

class FtpDelegate
{
public:
FtpDelegate() {}
virtual ~FtpDelegate() {}
virtual bool login(QString username, QString password) = 0;
// ...
};

class DummyDelegate : public FtpDelegate
{
public:
virtual bool login(QString username, QString password)
{
return true;
}
};

template<class Delegate>
class FtpServer : public QObject, Derived_from<Delegate, FtpDelegate>
{
Q_OBJECT
public:
explicit FtpServer(const QHostAddress &address = QHostAddress::Any,
quint16 port = 21,
QObject *parent = 0);

public slots:
void newConnection();

private:
QTcpServer *server;
QHostAddress address;
};

template <class Delegate>
void FtpServer<Delegate>::newConnection()
{
FtpDelegate *delegate = new Delegate();
new FtpConnection (delegate, server->nextPendingConnection(), address, this);
}

class FtpConnection : public QObject
{
Q_OBJECT
public:
explicit FtpConnection(FtpDelegate *delegate,
QTcpSocket *socket,
const QHostAddress &address,
QObject *parent = 0);

public slots:
void newDataConnection();

private:
QTcpSocket *socket;
QTcpServer *dataServer; // needed to transfer data to user
QTcpSocket *dataSocket;
};// server initialization
FtpServer<DummyDelegate> ftpServer();

а затем (вы, вероятно, видели, что это идет) БАМ!

Error: Template classes not supported by Q_OBJECT

вполне вероятно, что есть и другие ошибки или неправильные представления, так как я только начинаю изучать механизм шаблонов C ++ (и Qt также).

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

1

Решение

Невозможно создать шаблон класса Q_OBJECT (см. этот и ответы).

Вместо статического наследования следует использовать наследование во время выполнения и внедрить объект, наследуемый от класса FtpDelegate.


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


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

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]