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

时间:2015-03-23 21:23:50

标签: c++ c++03

我有一个工厂通过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,因此我不能在以后默认构造和分配数据成员。

1 个答案:

答案 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
}