假设我正在编写Derived,并且必须继承自Base,我不能控制,并有两个单独的构造函数和一个已删除的副本和移动构造函数:
struct Base { Base(int i); Base(const char *sz); Base(const Base&) = delete; Base(const Base&&) = delete; }; struct Derived { Derived(bool init_with_string); };
现在,根据another_param的值,我必须使用构造函数或另一个初始化我的基类;如果C有点不那么严格,那就像:
Derived::Derived(bool init_with_string) { if(init_with_string) { Base::Base("forty-two"); } else { Base::Base(42); } }
(这对于在直线表达式中计算值传递给基类构造函数/字段初始化函数是非常麻烦的所有情况也是有用的,但我是离题的)
不幸的是,即使我没有看到这种东西的特定代码或对象模型的障碍,这是无效的,我不能想到容易的解决方法.
有没有办法,我不知道?
解决方法
静态功能可以在这里工作
struct Base { Base(int i); Base(const char *sz); Base(const Base&) = delete; Base(const Base&&) = delete; }; struct Derived : Base { using Base::Base; static Derived construct(bool with_string) { if(with_string) return { "forty-two" }; return { 42 }; } };
请注意,这不需要移动,也不需要复制构造函数.如果要将其作为本地使用,则需要将其绑定到引用,以避免移动它
auto &&w = Derived::construct(true); auto &&wo = Derived::construct(false);