C 中 self 成员类型的自主实现
C 缺乏 PHP 中 self 关键字的显式语法,该关键字表示类型封闭类的。传统上,可以通过在每个类中定义 typedef 别名来手动模拟此行为:
struct Foo { typedef Foo self; };
但是,这种方法涉及重复类名,从而引入不匹配和错误的潜在风险。为了解决这个问题,提出了一种利用 decltype 和朋友的替代方法:
struct Foo { typedef decltype(*this) self; };
不幸的是,这种语法在类定义的上下文中无效。
实现 self 的自主实现,需要更复杂的方法。利用模板元编程,我们可以定义一个类模板 Self,它封装了类行为,同时消除了手动类型复制的需要:
template <typename...Ts> class Self; template <typename X, typename...Ts> class Self<X,Ts...> : public Ts... { protected: 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; } };
对于派生类, WITH_SELF_DERIVED 宏允许多重继承:
class WITH_SELF_DERIVED(Bar,Foo) { /* ... */ };
此解决方案与 gcc 4.8 和 clang 3.4 兼容,支持在 C 中自主实现 self 成员类型,而不需要显式的类名重复。
以上是我们如何在 C 中自动实现'self”成员类型?的详细内容。更多信息请关注PHP中文网其他相关文章!