C ++中静态成员函数型封闭类的C ++中静态成员函数型封闭类的(C++ type of enclo

2019-05-12 04:51发布

我认为这是完全不可能的,但如果什么。 是否有可能以某种方式获得的静态成员函数嵌套类,在C ++中的任何版本的类型?

class Impossible {
public:
    static void Fun()
    {
        typedef Impossible EnclosingClass;

        // now do something with EnclosingClass ...
    }
}

有没有办法让封闭类(类型Impossible不会在功能编写类的名称在这种情况下)?

为什么我想这样做的原因是为了避免重复功能的类名。 它可以很容易地导致很难找到复制粘贴错误,如果这样的事情发生了:

class SomeOther { // another class, with the same interface as Impossible
public:
    static void Fun()
    {
        typedef Impossible EnclosingClass;
        // whoops, copy-pasted, forgot to change "Impossible" to "SomeOther"

        // now do something with EnclosingClass ...
    }
}

有没有阻止这种事情发生的好办法? 我能想象感人的东西,被宣布封闭类私有的,但会逼着我写额外的代码(如我现在的设计不包含任何固有的私有成员,全部是公开的)。

Answer 1:

问题是,C ++缺乏一个self关键字。

我通常这样写:

struct Foo
{
   typedef Foo self;

   static void bar()
   {
      self* ptr = nullptr;
   }
};

我知道你还是要确保typedef是正确的,但至少这种方式,您可以在类型定义,你会发现它的顶部有它。

随着两轮牛车,不过, 你可以让这个完全自主 。



Answer 2:

C ++没有任何功能获得当前类,命名空间等。在C ++ 11就可以得到该变量的类型的名称,但你需要在第一位的变量。 在这种情况下,你没有什么下手。



Answer 3:

我喜欢尝试引进,你可以参考无关的类的一般名称的想法; 可维护性。

我的第一个方法是简单的一个:提供typedef在封闭类。 给出typedef同名每无关类。

class Impossible {
public:
    typedef Impossible Enclosing;
    static void Fun()
    {   
        Enclosing* theObject = 0;
    }   
};

这样做也会有效果-我把它叫做一个好处 -没有新的不相关的类来编译,你没有提供的typedef



文章来源: C++ type of enclosing class in static member function