首页 > 解决方案 > C++ 自注册类成员

问题描述

我正在寻找一种方法来实现以下目标:客户端类foo要么继承自一个名为的类,要么properties将其用作类成员。客户端类foo也可能有零个或多个 type 成员property。每个成员都应该使用客户端类property的实例自行注册:properties

struct foo :
    properties
{
    property<int> x;
    property<int> y;
};

这个想法是允许客户端类指定任意数量的属性,这些属性会自动“收集”以进行进一步处理,例如序列化,以便客户端类的作者不需要手动枚举/迭代每个属性。

我可以使用哪些技术来实现这一目标?我知道在静态工厂注册自己的自注册类的模式,但是如何在同一客户端类中的特定实例上自动实现自注册?这甚至可能吗?鉴于Q_PROPERTY做类似的事情应该有办法做到这一点?

任何达到 C++20(至少目前在 GCC 10.2 中可用的)都可以。

这个问题是对我以前的问题的更具体的问题。

标签: c++

解决方案


一个简单的设计可以是:

  • 属性派生自一个公共基类,它们本身就是它们的类型(例如 int、string、..)的模板化包装器
  • 财产持有人有财产地图,例如std::map<std::string, Property*> properties;
  • 属性的构造函数将指向持有者的指针作为参数,向持有者自我注册

Herbstluftwm (C++11) 的一个例子:

  1. 对象类
  2. 属性类
  3. 具有属性的示例对象:标签在 cpp 中初始化

推荐阅读