是否可以实现 __super 宏?
Posted
技术标签:
【中文标题】是否可以实现 __super 宏?【英文标题】:Is it possible to implement the __super macro? 【发布时间】:2011-05-18 07:10:27 【问题描述】:请告诉我是否有办法手动实现 Microsoft 特定的 __super 宏...
【问题讨论】:
请告诉我们 __super 宏的作用。 其实__super
不是宏,而是关键字——msdn.microsoft.com/en-us/library/94dw1w7x(v=vs.80).aspx
@Neil:msdn.microsoft.com/en-us/library/94dw1w7x.aspx
您有想要解决的特定用例吗?一般来说,使用用户代码提供完整的__super
实现的复杂性会太大,但如果您关注特定的用例,它可能不会那么复杂。
【参考方案1】:
class Base
public:
void func()
// something
;
class Derived : public Base
public:
void func()
Base::func(); // just use the base class name
;
虽然我认为这不是您想要的,并且您希望每个类都具有通用访问权限?我不知道直接的解决方案,但您始终可以typedef
您的直接基类:
class Derived : public Base
typedef Base super; // typedef accordingly in every class
public:
void func()
super::func();
;
如果你真的想要的话,甚至可以为 typedef 设置一个中间类。
template<class Base>
struct AddSuper : public Base
protected:
typedef Base super;
;
class Derived : public AddSuper<Base>
public:
void func()
super::func();
;
请注意,您不应忘记在每个派生类中重新键入定义,否则您会在调用链中出现漏洞。
一个缺点:整个结构因多个基类而崩溃。 :/
【讨论】:
@Ryan:typedef 的一个很好的副作用是,您可以在初始化列表中使用它,而不是(可能很长)基类名称。 :) 在从带有模板参数的类继承时,我已经使用了几次typedef
技巧(没有额外的中间体)。 DRY 在工作中......(或几乎,因为你需要重复一次)。
@Matthieu:我通常使用this_type
或self_type
或类似MSVC MyType
为当前类执行此操作,特别是如果它是模板化的。它还为我所有的操作员带来了很好的统一性。 :) 另外,我认为如果没有这样的 typedef,模板类通常无法使用。【参考方案2】:
避免它,它会使您的代码不可移植。如果你想为你的基类起一个短名称,那么使用 typedef:
class Derived: public BaseWithALongName
typedef BaseWithALongName super;
;
【讨论】:
【参考方案3】:关键字super
实际上早在 C++ 标准化过程中就提出了很长时间,但由于没有必要而被拒绝,因为它可以使用 Xeo 在他的回答中描述的方法来实现 - 这在 Stroustrup 的 D&E 书中有所介绍.我猜微软认为它确实是必要的,但是如果你使用它,你的代码将无法移植。
【讨论】:
__super
关键字的一个好处是您无法模仿,它考虑了所有基类。
@Xeo:这只是让代码变得更麻烦...您可以编写一个适配器模板,该模板将从所有基类继承并为每个基类添加一个using X::func;
类X
。然后最派生的类只需要从该适配器继承。如果你称它为super
,那么语法:super::func
将分派给直接父级,它将具有using
声明并考虑所有基类。仍然太复杂而几乎没有收获。
@David:不过,这是一个有趣的想法,谢谢。但你是对的。您不能拥有像简单混合这样的适配器,它需要为每个层次结构手动编码。 ://以上是关于是否可以实现 __super 宏?的主要内容,如果未能解决你的问题,请参考以下文章