【发布时间】:2020-05-31 12:55:26
【问题描述】:
在周日沉思……
从类派生会将基类中的所有名称都带入派生类的范围。但是,它也会将基类非静态数据成员添加到派生类的每个实例中。
有没有办法在没有后者的情况下实现前者?我问的是简洁的符号。
显然,当基类没有任何数据成员时,我得到了我想要的。在标准库中定义了很多空类或类模板来做到这一点 - 通过继承将名称概括地注入类范围。甚至还有空基类优化,以使其尽可能便宜。
但如果我想对非空基类做同样的事情,我会很想使用类似的东西:
struct Bar {
using struct Foo;
};
但是,可惜的是,C++ 不支持。我的问题是,是否有另一种方法可以实现我忽略的相同功能?
提供一个更完整的例子:
struct Foo {
enum { some_constant=42 };
// data members follow here ...
};
struct Bar {
using class Foo; // this doesn't compile
int f();
};
int Bar::f() {
return some_constant; // I want to use the constant directly, without Foo::
}
一种笨拙的方法可能是将 Foo 中的定义分成两个类,一个带有常量(这将是一个我可以从中派生而不会受到惩罚的空类),另一个带有数据成员,但这看起来很像对我来说不优雅。
如果没有一种干净的方法来实现这一点,也许有人可以提供一个理由,说明它为什么不存在,或者不应该存在。
【问题讨论】:
-
为什么要这样做?
-
我想达到一个最简洁的符号,特别是当类中定义了许多常量时。
-
它不存在,因为没有人提出定义它的建议,并通过标准化过程引导它。您将如何增加名称查找规则以适应此功能?它应该只找到枚举值吗? typedef 呢?静态数据成员和成员函数?非静态的?它应该查看
using class指令指定的类的基类吗?进入类那个类以using class提名?如果名称存在于正确的基类以及using class指定的基类中,会发生什么? -
目前,我假设它会像推导一样工作,只是不将非静态数据成员添加到客户端类中。那会有什么问题吗?当然,根据
using class Foo;行的位置,可以将定义继承为私有、受保护或公共。
标签: c++