0

私はそれを行う方法を知りません..

基本的に、各テンプレートの特殊化タイプ (T) がその初期化用に異なるパラメーターを持っている場合、一般化された ResourceCache はどのようにしてリソースをロード/作成できますか?

template< class T>
class ResourceCache{

  T* cache[100];

  T* LoadResource(different parameters for different  T  ){//used in a cache miss..

          Create( different parameters for different  T );

  }
}

IResourceParams クラスなどに抽象化を使用すると、ResourceCache はポリモーフィズムを使用せずに独自の既知の型のリソース データを使用できなくなります。コンパイル時機能のprolでのランタイム...私は推測します..

私の現在の試行では、仮想 T* Create() メソッドを持つテンプレート化された IResourceDesc を作成したため、データを追加して Create メソッドを特殊化するために派生する必要がありますが、ResourceCache クラスに IResourceDesc のコレクションを持つことができないため、それはうまくいきません。 (現在読み込まれているものを比較したり、desc によってキャッシュされたリソースを取得したりするためなど)...

4

1 に答える 1

2

C++11 では、可変個引数テンプレートと完全転送を使用すると、これはかなり簡単です。

#include <utility>

template<class... Args>
T* LoadResource(Args&&... args){
  unsigned dest_index = /* pick it */ 0;
  cache[dest_index] = new T(std::forward<Args>(args)...);
  return cache[dest_index];
}

C++03 の場合、パラメーターの数が異なる最大 10 個のオーバーロードを提供するか、インプレース ファクトリ スタイルを使用します。

template< class T>
class ResourceCache{
  T* cache[100];

  template<class Factory>
  T* LoadResource(Factory const& f){
    unsigned dest_index = /* pick cache slot */ 0;
    void* dest = operator new(sizeof(T));
    cache[dest_index] = f.construct(dest);
    return cache[dest_index];
  }
}

template<class T, class A1>
struct in_place_factory1{
  in_place_factory1(A1 const& a1) : _arg1(a1) {}
  int* construct(void* dest) const{
    return new (dest) T(_arg1);
  }
private:
  A1 const& _arg1; // make sure the original argument outlives the factory
};

// in code
ResourceCache<int> cache;
int arg = 5;
int* res = cache.LoadResource(in_place_factory1<int,int>(arg));

インプレース ファクトリは、基本的に、コピー用の既に完全なオブジェクトを必要とせずにオブジェクトをコンテナー ストレージに直接配置できる、完全転送の可変個引数テンプレート関数の劣ったバージョンです。

于 2012-07-16T04:52:27.483 に答える