C 中不重复的自引用类
C 没有提供与 PHP 的 self 关键字等效的关键字,该关键字表示封闭类的类型班级。要为特定类模拟它,可以定义:
struct Foo { typedef Foo self; };
但是,这需要重复类名称,为静默错误留出空间。是否有一种使用 decltype 和朋友的“自主”方法来实现此目的?
以下语法由于在顶层无效使用而失败:
struct Foo { typedef decltype(*this) self; };
一个解决方案涉及引入模板类Self如下:
template <typename... Ts> class Self; template <typename X, typename... Ts> class Self<X, Ts...> : public Ts... { typedef X self; };
然后可以使用宏来简化类定义:
#define WITH_SELF(X) X : public Self<X> #define WITH_SELF_DERIVED(X, ...) X : public Self<X, __VA_ARGS__> class WITH_SELF(Foo) { void test() { self foo; } };
派生可以通过以下方式处理:
class WITH_SELF_DERIVED(Bar, Foo) { /* ... */ };
多重继承和可变参数宏可以轻松地与复杂的类层次结构集成:
class WITH_SELF(Foo2) { /* ... */ }; class WITH_SELF_DERIVED(Bar2, Foo, Foo2) { /* ... */ };
这种技术已通过 GCC 4.8 和 Clang 3.4 进行测试和验证。
以上是如何在C类中实现自引用而不重复类名?的详细内容。更多信息请关注PHP中文网其他相关文章!