【发布时间】:2011-03-08 09:20:46
【问题描述】:
在 C++0x 中转发所有父级构造函数的正确方法是什么?
我一直在这样做:
class X: public Super {
template<typename... Args>
X(Args&&... args): Super(args...) {}
};
【问题讨论】:
-
是否有理由反对键入所有构造函数而不是使用模板快捷方式?
-
是的,时间,如果超级类更新,那么他将陷入混乱的维护之中。自动化解决方案具有无限优势。
-
@DeadMG - 不是真的。那么如果基础得到一个新的构造函数呢?除非需要新信息,否则派生不需要使用它。在这一点上,这个自动化的“解决方案”只是自动将处理这个问题推给派生的所有客户。这通常是完全错误的做法。 Derived 不应该更新,除非有一些对象需要它,并且应该明确地完成,以便通过查看其构造函数来构建对象是显而易见的。为可变参数条件保留可变参数模板。
-
@Thomas - 我发现了类似的用途,所以我想有一些稍微不同的问题最好通过这种结构来解决。在我的情况下,我想要一个通用的“持有人”类,它可以包含任何类型,即使它不是默认可构造的。因此,持有者本身必须接受与其持有的相同的论点,这实际上只能以这种方式解决。
-
@Noah:调用 X 的构造函数是一个可变参数条件 - 你想用 Super 的任何构造函数构造 X,因为 X 不想知道。如果 base 得到一个新的构造函数,Derived 可以自动使用它,而不必为新的 Super 手动更改所有代码。
标签: c++ templates constructor c++11