首页 >后端开发 >C++ >如何在C类中实现自引用而不重复类名?

如何在C类中实现自引用而不重复类名?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-03 14:35:14216浏览

How Can I Achieve Self-Referencing in C   Classes Without Repeating the Class Name?

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn