这是我想要开始工作的代码:
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 中是允许的。您可以通过为构造函数生成最多固定最大值(例如 8 个参数)的重载来模拟它,无论是 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 可用之前不要自己编写构造函数,它支持both任何函数的完美转发,以及特殊的构造函数转发("using A::A;"
).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)