C++ 缺少 PHP 的 self
关键字 的等效项,它计算为封闭类的类型。
在每个班级的基础上伪造它很容易:
struct Foo
{
typedef Foo self;
};
但我不得不再次写 Foo
。也许有一天我会弄错这个并导致一个无声的错误。
我可以使用 decltype
和朋友的某种组合来“自主”完成这项工作吗? 我已经尝试了以下 方法,但是 this
在那个地方无效:
struct Foo
{
typedef decltype(*this) self;
};
// main.cpp:3:22: error: invalid use of 'this' at top level
// typedef decltype(*this) self;
(我不会担心 static
的等价物,它的作用相同,但具有后期绑定。)
原文由 Lightness Races in Orbit 发布,翻译遵循 CC BY-SA 4.0 许可协议
以下是您可以在不重复 Foo 类型的情况下执行此操作的方法:
如果要从
Foo
派生,则应按以下方式使用宏WITH_SELF_DERIVED
:您甚至可以使用任意数量的基类进行多重继承(感谢可变参数模板和可变参数宏):
我已经验证了它可以在 gcc 4.8 和 clang 3.4 上工作。