c++ - C++自注册类成员

标签 c++

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

struct foo :
    properties
{
    property<int> x;
    property<int> y;
};
这个想法是允许客户端类指定自动“收集”以进行进一步处理(例如序列化)的任意数量的属性,以便客户端类的作者无需手动枚举/迭代每个属性。
我可以使用哪些技术来实现这一目标?我知道在静态工厂中注册自己的自注册类的模式,但是如何在同一客户端类中的特定实例处实现自注册呢?这有可能吗?鉴于 Q_PROPERTY 做了类似的事情,应该有一种方法吗?
任何C++ 20(至少在GCC 10.2中当前可用)都可以。
这个问题是针对我的previous question的更具体的问题。

最佳答案

您无法完全自动执行此操作,但可以到达以下位置:

#include <map>
#include <variant>
#include <string>
#include <memory>

template <typename T>
struct property {};

struct properties
{
    std::map<std::string, std::variant<std::shared_ptr<property<int>>>> properties;

    template <typename T>
    std::shared_ptr<property<T>> make_prop(const std::string& name)
    {
        auto prop = std::make_shared<property<T>>();
        properties[name] = prop;
        return prop;
    }
};

struct foo :
    properties
{
    std::shared_ptr<property<int>> x = make_prop<int>("x");
    std::shared_ptr<property<int>> y = make_prop<int>("y");
};

int main () {
    foo f;
}
根据您的要求,您可能需要std::any而不是std::variant
您可以添加一个宏来声明属性:
#define MAKE_PROP(name, type) \
  std::shared_ptr<property<type>> name = make_prop<type>(#name);

struct bar :
    properties
{
    MAKE_PROP(x, int);
    MAKE_PROP(y, int);
};

关于c++ - C++自注册类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64875116/

相关文章:

c# - OpenCV - 如何检测和测量两帧之间的角度?

c++ - Boost - 在图中查找最大匹配边

c++ - 绘制大量重叠的二维阴影

C++随机数1-9

c++ - QFileDialog自定义布局

c++ - |、~ 和 & 运算符的运算符优先级?

c++ - CreateDirectory 报告失败,但错误代码为 ERROR_SUCCESS

c++ - 为什么 return 会改变我的值(value)?

c++ - 如何快速复制 std::string 内容?

c++ - 我不能使用 auto_ptr 的 std::vector - 我应该使用 shared_ptr 吗?