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

标签 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
  }
};

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

最佳答案

不,这目前在 C++ 中是不可能的。它被称为“完美转发”,在 C++0x 中是允许的。您可以通过为 const 和非常量引用生成最多固定最大值(例如 8 个参数)的构造函数重载来模拟它。这仍然不完美(临时文件不会作为临时文件转发),但通常在实践中有效:

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 可用之前不要自己编写构造函数,它支持两者任何函数的完美转发,以及特殊的构造函数转发(“使用 A::A ;").

关于c++ - 自动创建构造函数,基于父类的构造函数(C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1444837/

相关文章:

javascript - 使用字符串 "constructor"作为 JavaScript 对象中的键

从 VS 6 到 VS 2013 的 C++ IDE 迁移

c++ - CUDA 对 int2 的重新声明无效

c++ - 进程名称比较

c++ - << 模板类对象的运算符重载

templates - 如何在 Grails 中部分更新布局/模板

C++ - 未调用函数模板特化

javascript - 未捕获的类型错误 : "(function call) is not a function"

c++ - 如何实现运算符重载?

java - 在构造函数上使用 init() 方法是一种不好的做法吗?