是否可以实现 __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_typeself_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 宏?的主要内容,如果未能解决你的问题,请参考以下文章

可变宏

c中的宏数组-是不是可能

CMake C / C ++宏生成[重复]

Python中super()和__init__()方法

Python内置函数之super()

是否可以使按钮透明(Kivy)