Вместо того, чтобы передавать явное значение, передайте объект, который создает ваш экземпляр для вас:
template <typename type1>
struct DefaultInstanceCreator {
type1 * operator ()() const {
return new type1;
}
};
template < typename type1
, typename InstanceCreator = DefaultInstanceCreator<type1> >
class objectCache {
public:
objectCache (InstanceCreator const & instCreator)
: instCreator_ (instCreator) {
}
type1* Get() {
type1 * temp = instCreator_ ();
}
private:
InstanceCreator instCreator_;
};
Тогда у вашего объекта может быть свой особый создатель:
class A {
public:
A(int num){
number = num;
}
int number;
public:
struct CreateInstance {
CreateInstance (int value)
: value_ (value) {
}
A * operator ()() const {
return new A(value_);
}
int value_;
};
};
int main(int argc, char* argv[]) {
objectCache<A, A::CreateInstance> intcache ( A::CreateInstance (1) );
A* temp = intcache.Get();
return 0;
}
Преимущество этого подхода состоит в том, что вы можете использовать свой кэш с объектами, которые имеют разное количество аргументов для своих конструкторов.