静态成员函数中封闭类的C++类型

C++ type of enclosing class in static member function

本文关键字:C++ 类型 函数 静态成员      更新时间:2023-10-16

我认为这完全不可能,但如果。是否可以在任何版本的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 ...
    }
}

有没有防止这种事情发生的好方法?我可以想象触摸在封闭类中被声明为私有的东西,但这会迫使我编写额外的代码(因为我当前的设计不包含任何固有的私有成员,一切都是公共的)。

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

我通常写:

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

我意识到您仍然必须确保typedef是正确的,但至少这样您可以将其放在类型定义的顶部,您会注意到它。

但是,通过黑客攻击,您可以使其完全自主。

C++没有任何

功能来获取当前类、命名空间等的名称。在 C++11 中,您可以获取变量的类型,但首先需要变量。在这种情况下,您没有任何开始。

我喜欢尝试引入一些可以在不相关的类中引用的通用名称的想法; 为了可维护性。

我的第一个方法是一个简单的方法:在封闭类中提供一个typedef。 在每个不相关的类中为typedef指定相同的名称。

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

这样做也会产生效果 - 我称之为好处 - 无法在你没有提供typedef的新不相关的类中编译。