在使用和不使用参数初始化时防止代码重复

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
}