基于父类的构造函数(C ++)自动创建构造函数

时间:2009-09-18 14:17:10

标签: c++ templates constructor

这是我想要开始工作的代码:

template <class A>
class B : public A {
public:
  // for a given constructor in A, create constructor with identical parameters,
  // call constructor of parent class and do some more stuff
  B(...) : A(...) {
    // do some more stuff
  }
};

是否有可能实现上述示例所描述的行为?

3 个答案:

答案 0 :(得分:8)

目前在C ++中无法实现这一目标。它被称为“完美转发”,并且在C ++ 0x中被允许。您可以通过生成构造函数的重载来模拟它,直到固定的最大值(例如,8个参数),对于const和非const引用都是如此。这仍然不完美(临时工具不会作为临时工具转发),但通常在实践中有效:

template<typename T1>
B(T1 &a1):A(a1) { 
  // do some more stuff
}

template<typename T1>
B(T1 const &a1):A(a1) { 
  // do some more stuff
}

template<typename T1, typename T2>
B(T1 &a1, T2 &a2):A(a1, a2) { 
  // do some more stuff
}

template<typename T1, typename T2>
B(T1 const &a1, T2 const &a2):A(a1, a2) { 
  // do some more stuff
}

template<typename T1, typename T2>
B(T1 const &a1, T2 &a2):A(a1, a2) { 
  // do some more stuff
}

template<typename T1, typename T2>
B(T1 &a1, T2 const &a2):A(a1, a2) { 
  // do some more stuff
}

// ...

可以使用Boost.Preprocessor或某些脚本自动生成代码,但这并不是很好,因为重载量会快速增长。

所以简而言之 - 在C ++ 0x可用之前不要自己编写构造函数,它支持 完美转发任何函数,以及特殊的构造函数转发("using A::A;")。

答案 1 :(得分:2)

我通过STL挖掘并根据我在那里找到的东西,我决定使用这段代码:

template <class Data>
class Node : public Data {
public:

  template<typename... _Args>
  Node (_Args&&... __args) : Data (std::forward<_Args>(__args)...) {
  }

  // ...
};

它适用于命令:

  

g ++ -std = c ++ 0x -c code.cpp

答案 2 :(得分:1)

查看最近发布的文章

Use C++0x's Inheriting Constructors to Reduce Boilerplate Code in Class Hierarchies

on http://www.devx.com

它可能会为您的问题描述 future 解决方案。