C++ 可以实现超级宏吗?

C++ 可以实现超级宏吗?,c++,visual-c++,gcc,macros,C++,Visual C++,Gcc,Macros,请告诉我是否有办法手动实现Microsoft特定的\uu super宏 class Base{ public: void func(){ // something } }; class Derived : public Base{ public: void func(){ Base::func(); // just use the base class name } }; 虽然我假设这不是你想要的,你想要每个类都有一个通用的访问权限?我不知道直接解决方案,但您

请告诉我是否有办法手动实现Microsoft特定的\uu super

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();
  }
};
模板
struct AddSuper:公共基{
受保护的:
typedef-Base-super;
};
派生类:public AddSuper{
公众:
void func(){
super::func();
}
};
请注意,您不应该忘记在每个派生类中重新定义typedef,否则您的调用链会出现漏洞


一个缺点是:整个构造会出现多个基类:/

避免它,它会使您的代码不可移植。如果希望基类有一个简短的名称,请使用typedef:

class Derived: public BaseWithALongName
{
   typedef BaseWithALongName super;
};

一个关键字>代码> Suth/<代码>实际上是在C++标准化过程中提出的,但它被拒绝为不必要的,因为它可以用Xeo在他的回答中描述的方法来实现——这是Stroustrup D&E书中所涉及的。我猜微软认为这确实是必要的,但是如果你使用它,你的代码将无法移植。

请让我们知道超级宏的作用。实际上,
\uuuuuu super
不是一个宏,而是一个关键字-@Neil:你有一个特定的用例需要解决吗?一般来说,使用用户代码提供完整的
\uuuu super
实现的复杂性太大,但是如果您关注某个特定的用例,它可能没有那么复杂。
\uu super
关键字的一个优点是它考虑了所有的基类。@Xeo:这是一个让代码更麻烦的问题。。。您可以编写一个适配器模板,该模板将继承所有基类,并使用X::func添加一个
对于每个基类
X
。那么最派生的类只需要从该适配器继承。如果调用它“代码>超级< /代码>,那么语法:<代码> Suff:Func < /Cord>将发送到直接父级,使用声明,将具有<代码>,并将考虑所有基类。还是太复杂了,收获甚微。@David:不过这是个有趣的想法,谢谢你。但你是对的。您不可能有一个简单的mixin适配器,它需要为每个层次结构手工编码/@Ryan:typedef的一个很好的副作用是,您可以在初始值设定项列表中使用它,而不是(可能很长)基类名称。:)当从带有模板参数的类继承时,我已经使用了
typedef
技巧(没有额外的中间变量)。干在工作中。。。(或者差不多,因为你需要重复一次)。@Matthieu:我通常用
this\u type
self\u type
或类似MSVC
MyType
的当前类来做这件事,特别是如果它是模板化的。它还为我的所有操作员带来了良好的一致性。:)此外,我认为模板类通常不可用,没有这样的Type。