在使用和不使用参数初始化时防止代码重复
Preventing code duplication when initializing with and without arguments
我有一个工厂,它通过 Create
方法创建 T
类型的对象。 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
,所以我不能只是默认构造并稍后分配数据成员。
我个人使用类似于此的宣传语:
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
}
我有一个工厂,它通过 Create
方法创建 T
类型的对象。 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
,所以我不能只是默认构造并稍后分配数据成员。
我个人使用类似于此的宣传语:
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
}