我有一个工厂通过T
方法创建Create
类型的对象。 T
要么有或没有带参数的构造函数。我希望能够选择性地传递参数。这就是我所拥有的:
template<typename U>
T* Create(U const& arg) {
if (nodes_.empty()) {
return new T(arg);
}
void* n = nodes_.front();
nodes_.pop_front();
return new (n) T(arg);
}
T* Create() {
if (nodes_.empty()) {
return new T();
}
void* n = nodes_.front();
nodes_.pop_front();
return new (n) T();
}
我很厌恶我正在招致的代码重复。如果这是C ++ 11,我只需使用参数包并将它们转发给构造函数。但遗憾的是我无法使用该标准。有什么方法可以将它合并到一个界面中吗?
此外,我正在使用的对象是const
,因此我不能在以后默认构造和分配数据成员。
答案 0 :(得分:3)
我个人使用类似于此的模糊:
struct do_default_construct {};
template<class T, class U>
T* construct(T* p, U const& v) {return new (p)T(v);}
template<class T>
T* construct(T* p, do_default_construct const& v) {return new (p)T();}
然后你的专业化可以简单地调用泛型版本:
template<typename U>
T* Create(U const& arg) {
if (nodes_.empty()) {
return new T(arg);
}
void* n = nodes_.front();
nodes_.pop_front(); //irrelevant bugfix here
return construct<T>(n, arg); //use overloaded function
}
T* Create() {
const do_default_construct t;
return Create(t); //call generic version
}