私はpointAccumulatorのための抽象基底クラスを持っています。この抽象基底には、すべての点の平均を返す関数などのメソッドがあります。この2つのクラスの例を以下に示します。仮想関数とテンプレートの衝突
class lala {
public:
virtual someFunctions = 0;
virtual bool isEmpty() = 0;
};
class lalaLower : public lala {
public:
lalaLower(){}
~lalaLower(){}
someFunctions
template<class Archive> void serialize(Archive & ar, const unsigned int version) {
ar & heights_;
}
protected:
std::deque<double> heights_;
};
私はまた、これらのタイプを保存するには、ブーストのシリアル化を使用したいコードに見ることができるように。今、工場出荷時のパターンを使用して私はあなたがこのようなpointAccumulatorタイプを呼び出すと信じている:
lala *a1 = new lalaLower();
私の問題は、私はこのようにそれを呼び出す場合テンプレートSerializeメソッドはアクセスできないということです。また、C++ではこれが許可されていないので、抽象クラスのテンプレートクラスを持つことはできません。これを回避する方法はありますか?
編集:
私は直列化のための非侵入方法と考えられてきたが、それは理想的ではありませんどの公共するheights_を必要とし、またそれは良いプログラミングスタイルです。私は潜在的に、基本クラスを抽象的に保ちながら、フレンドクラスまたは関数を使用するメソッドが変数へのアクセスを持つクラスに浸透する可能性があると考えましたか?誰でもこれがどのように機能するのか説明できますか?
これは基本的な問題です。仮想関数は、型に基づいた実行時選択に関するものです。テンプレートは、型に基づいたコードのコンパイル時生成に関するものです。実行時まで型を知らなければ、コンパイル時にコードを生成することはできません。 –
うん、私は質問でそれを述べた。だから私は今質問があると思う、それについてもっと良い方法と別の方法があるのだろうか? –
私はこれが書籍 "Modern C++ Design by Andrei Alexandrescu"で議論されている基本的なトピックだと思います。 これをよく理解したい場合は、それをお読みください。 – manasij7479