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 回答