[英]Duplicating base-class constructors to subclass?
我有一个大型集合类,需要将其“包装”在一个非常薄的子类中。 基类的功能不变,并且它们的接口保持不变。
问题是,为了使用基类的构造函数(它们中的大多数都具有多个),我需要在每个子类中分解一个相同的构造函数,然后将参数简单地传递给基类的构造函数(99%的时间,我在构建时无事可做)。 这是很多没有意义的工作。
最简单的方法是什么?
编辑:即使语言本身不支持它,也许有些工具可以自动生成该代码?
您可以将所有可能参数的模板化构造函数添加到包装类:
template<class Base>
class wrapper : public Base {
public:
wrapper() : Base() {}
template<typename T1>
wrapper(T1 a1) : Base(a1) {}
template<typename T1, typename T2>
wrapper(T1 a1, T2 a2) : Base(a1, a2) {}
// ...
};
由于不会为未调用的构造函数实例化模板,因此这些其他构造函数是否无效也无关紧要。 只有实际使用的构造函数才需要存在于基类中:
class A {
public:
A(int a) {};
};
int main() {
wrapper<A> aw(1);
return 0;
}
在某些极端情况下,这种方法可能会导致问题,但是对于简单情况,它是可行的。
我认为除非您可以使用C ++ 0x,否则您很不走运。 阅读本文:
一厢情愿的想法促使我提出建议
class BaseClass {
public:
BaseClass(foo, bar, baz);
};
template <class T>
class BaseInheritor : public BaseClass {
public:
T(foor, bar, baz);
};
class Child : public BaseInheritor<Child> {
// Other stuff
};
不幸的是,我认为C ++模板不能完全完成我刚才写的工作。 宏有一个非常简单的答案,但是我建议这样做很脏:
#define CHILD_CLASS_DEFAULT(name) \
class name : public BaseClass { \
public: name(foo, bar, baz) : BaseClass(foo, bar, baz) { } \
private:
#define CHILD_CLASS_OVERRIDE(name) \
class name : public BaseClass { \
我会选择基于脚本的解决方案,也许基于gccxml或类似的东西。
这样,您可以编写一个简单的脚本(即generate-derivate <input-file> <base-name> <derivative-name> <output-file>
)来生成包装器。 如果要添加/更改功能,则只需手动进行更改。
编辑:模糊的轮廓:
write derivative-name + " : public " + base-name + " {\npublic:\n"
foreach <Constructor> where attribute name == base-name
write "\tderivate-name("
foreach <Argument>
resolve by attribute type (query FundamentalType, ReferenceType, ...)
write argument type etc.
write ");\n"
write "\n};\n"
这完全取决于您使用的脚本语言和XML工具。 Trolltech 的示例中包含XQuerys。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.