我正在寻找一种实现以下目标的方法:客户端类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/