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

C++ C++;静态成员函数中封闭类的类型,c++,types,static-methods,C++,Types,Static Methods,我认为这是完全不可能的,但如果。是否可以在静态成员函数中得到任何类型的封闭类,在C++的任何版本中? class Impossible { public: static void Fun() { typedef Impossible EnclosingClass; // now do something with EnclosingClass ... } } 有没有一种方法可以在不在函数中写入类名的情况下获取封闭类的类型(在本例中不可能

我认为这是完全不可能的,但如果。是否可以在静态成员函数中得到任何类型的封闭类,在C++的任何版本中?
class Impossible {
public:
    static void Fun()
    {
        typedef Impossible EnclosingClass;

        // now do something with EnclosingClass ...
    }
}
有没有一种方法可以在不在函数中写入类名的情况下获取封闭类的类型(
在本例中不可能

我这样做的原因是为了避免在函数中重复类名。如果发生类似情况,很容易导致难以找到的复制粘贴错误:

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

我喜欢尝试引入一些通用名称,您可以在不相关的类中引用;可维护性

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

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

这样做也会产生效果,我会称它是一个好处——在没有提供新的不相关的类的情况下,你没有提供<代码> TyPulfF。< /P> < P>问题是C++缺少一个<代码>“自我/代码>关键字”。 我通常写:

struct Foo
{
   typedef Foo self;

   static void bar()
   {
      self* ptr = nullptr;
   }
};
我意识到您仍然需要确保
typedef
是正确的,但至少通过这种方式,您可以将它放在类型定义的顶部,您会注意到它


但是,对于hackery,.

+1,感谢你告诉我们为什么你需要这个,而不必被戳和戳。@jbgs我不知道我是否理解这会有什么帮助。你是说把所有的乐趣都变成模板?这将使我在每次调用时重复类名两次,而不仅仅是每次声明。请注意,尽管Run()在大多数情况下都是相同的(因此容易出现复制粘贴错误),但在某些情况下可能会有所不同,因此我认为将其设置为全局静态函数并不是一个好主意(但同样,可以使用该函数的模板专门化)。这就是你的想法吗?@johndilling:我真的感到惊讶的是,这里没有太久的人开始发表“但它真的那么重要吗?”系列评论。问类似的问题就像在砖墙中穿行,你不仅要解释你为什么要这样做,还要在别人帮助你之前说服他们为什么要这样做。否则,他们只会花几个小时告诉你为什么错了,你要找的东西完全没有必要,更不用说你告诉他们你为什么想要它了+1问一个好问题。我想知道你为什么一开始就要复制粘贴,但可能我的水平太高了。@rubenvb这是一个发生在图形框架中的问题,其中大多数边/顶点类非常相似,但有细微的差异。实现本身非常小,只有几行代码,因此在使用通用实现方面没有太多工作要做,无论是基类还是实用函数。不幸的是,这些东西被复制/粘贴了。还看哇,那么优雅。我不明白我怎么没看到。谢谢。decltype太糟糕了,那将是最酷的(非常感谢您的尝试)。但听到有人说“我通常是写的”,我仍然感到安慰,我有点担心我在试图实现一些愚蠢的事情。你真的认为使用
这个
(即使是未经计算的)的表达式在静态函数中不会起作用,是吗?@JamesKanze:不,但我想我还是试试吧,以防万一它在未经评估的环境中得到特殊处理,或者其他什么。奇怪的事情发生了。(BTW是在类范围内,而不是在静态成员函数中。)我认为<>代码> Type类型和 BaseType 与C++命名约定很好,Boost也遵循这个约定。