これは、私が達成しようとしているものの大まかなイメージです (コンパイルされないため、疑似コードと考えてください)。この例は公開鍵暗号スキームに基づいていますが、問題は設計パターン、テンプレート、および継承に関するものであることに注意してください。
class CryptoProvider
{
public:
template <typename T>
virtual T Encrypt ()
{
T data;
return data;
}
};
class Paillier : public CryptoProvider
{
public:
typedef int Ciphertext;
Ciphertext Encrypt ()
{
Ciphertext data;
return data;
}
};
class ElGamal : public CryptoProvider
{
public:
struct Ciphertext
{
public:
int c1;
int c2;
};
Ciphertext Encrypt ()
{
Ciphertext data;
return data;
}
};
基本的に、CryptoProvider でいくつかの一般的な機能を提供したいと考えています。これは、必要に応じて派生クラスによってオーバーライドできます。そうしないと、多くの重複したコードになってしまうからです。変数を作成して別の関数を呼び出すだけの場合Encrypt
は、すべての派生クラスにこのコードを記述したくありませんが、派生クラスがデータに対して追加の処理を行う必要がある場合は、ベースメソッド。
私が遭遇した最大の制限は、まったく異なる戻り値の型を指定することで Encrypt 関数をオーバーライドできるようにすることです。これを達成する方法について、誰かが私を正しい方向に向けることができますか? 従来の継承に固執する必要がありますか、それともCRTPを使用してコンパイル時/静的ポリモーフィズムを試みる必要がありますか? どこから始めればよいかわかりません。
また、派生クラスに特定のメソッドを実装するように強制したいのですが、最初の問題の解決策で標準の継承を破棄する必要がある場合 (および仮想メソッドの恩恵を受けない場合)、これを達成する方法がわかりません.. .