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

时间:2014-01-15 16:45:01

标签: c++ types static-methods

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

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

3 个答案:

答案 0 :(得分:9)

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

我通常写道:

struct Foo
{
   typedef Foo self;

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

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

但是,有了hackery,you can make this entirely autonomous

答案 1 :(得分:3)

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

答案 2 :(得分:3)

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

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

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

执行此操作也会产生影响 - 我称之为好处 - 无法在新的无关类中编译,但您尚未提供typedef