首页 >后端开发 >C++ >我们如何在 C 中自动实现'self”成员类型?

我们如何在 C 中自动实现'self”成员类型?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-07 21:39:13408浏览

How Can We Automatically Implement a `self` Member Type in C  ?

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

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