次のタイプのデータを格納するコンテナーラッパーを考え出そうとしています:bool、int、double、std::string。さらに、コンテナに格納する必要がある複雑なタイプがあります。それをFooと呼びましょう。簡単にするために、Fooにはintのリストが含まれていると言います。
私のコンテナクラスは現在、acapiから取得した醜く複雑なコンテナタイプをラップしています。コンテナ内のデータの操作が終了したら、それをAPIにコピーして戻す必要があります。ユニオンとリンクリストを使用します。このデータをたとえばstd::listにコピーすることは可能ですが、これによりパフォーマンスの問題が発生し、後日発生する可能性があります。したがって、私のコンテナクラスは、データが実際にメモリに格納される方法に依存しません。
これが私のコンテナがどのように見えるかについての簡単なアイデアです:
template <class T>
class Cont
{
public:
Cont(ISetter<T>* setter)
: _setter(setter)
{
}
void sillyFunction(T t)
{
(*_setter)(t,0);
}
private:
...
ISetter<T>* _setter;
};
そこで、メモリの要点を処理するヘルパーセッタークラスを使用します。私はこれらのクラスをいくつか持っていますが、ISetterは私が何をしているのかをあなたに教えてくれます。
かなり奇妙な方法でcapiによっても保存されるFooタイプに対処するために、私は次のセッターに到達しました。繰り返しますが、これは大まかな例です。
class IFoo
{
public:
virtual int getMember() = 0;
};
class Foo2: public IFoo
{
public:
virtual int getMember(){ return 1;} // dummy
};
template<typename T> class ISetter{};
template<> class ISetter<IFoo*>
{
public:
virtual void operator()(IFoo* value, int index) = 0;
};
template<typename T> class Setter{};
template<> class Setter2<Foo2*>: public ISetter<IFoo*>
{
public:
virtual void operator()(IFoo* value, int index)
{
_list[index] = dynamic_cast<Foo2*>(value);
}
private:
std::vector<Foo2*> _list;
};
そのため、FooをIFooというインターフェイスとして処理します。Setter2の実装は、Foosのリストのメモリ内の設定を処理します。Setter1は、以下にありませんが、醜いcapiメモリを扱います。
これらのクラスの実際のアイデアは次のとおりです。
Foo2* f = new Foo2();
ISetter<IFoo*>* setter = new Setter2<Foo2*>();
Cont<IFoo*>* container = new Cont<IFoo*>(setter);
container->sillyFunction(f);
たとえば、intを扱うときは、代わりに次のようにします。
int i = 10;
ISetter<int>* setter = new Setter1<int>();
Cont<int>* container = new Cont<int>(setter);
container->sillyFunction(i);
ですから、私の質問は、これが良いアプローチであると思うかどうか、そしてどのような改善をお勧めするかということです。
生のポインターの代わりに共有ポインターを使用します。