这是我想要开始工作的代码:
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/