这是我想要开始工作的代码:
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
}
};
是否有可能实现上述示例所描述的行为?
答案 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
它可能会为您的问题描述 future 解决方案。