サーバーの初期化時に提供されるユーザー (ログインとパスワードのチェック、ファイルの配信など) を処理するクラスでパラメーター化できる単純な柔軟な 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 の派生クラスごとにファクトリ実装を作成したりする必要なく、それを機能させる最良の方法は何ですか。私には見えない巧妙なデザインパターンがあるのかもしれません。最終的には、ネットワーク メカニズムを書き直して、それが最適なオプションである場合はブーストすることができます。