我认为这是完全不可能的,但如果。在任何版本的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 ...
}
}
有没有一种好方法可以防止这类事情发生?我可以想象触摸在封闭类中声明为私有的东西,但这会强迫我编写额外的代码(因为我当前的设计不包含任何固有的私有成员,所有都是公共的)。
答案 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