用元数据标记C 类实例

Tagging C++ class instances with metadata

本文关键字:实例 元数据      更新时间:2023-10-16

i具有C 工厂功能,该功能将用于实例化某些来自某些抽象类的混凝土类。

从代码操作的角度来看,这些具体类的实际英语名称并不重要。说它们是不同类型的"事件",源自" AbstractEvent"类。出于代码函数的目的,派生类的实际名称无关紧要,因为它们都会在实例化中生成某种独特的数值ID,这将是其他模块将如何指向它们,这只会与之一起使用引用抽象类型,而不是任何特定的具体类。

从代码维护的角度来看,对于编码者而言,某个类别或方法是否接受了一个" fooevent",这是有帮助的浮动,因此使用API时用户正在使用的内容有一些可读的术语。

是否有一种"规范"的方法可以实现这一目标?如果解决方案没有生成任何运行时开销,这是最好的。

constexpr字符串标识符:

怎么样
#include <iostream>
#include <string>
#include <memory>
struct EventBase
{
    virtual const std::string& type() const = 0;
    virtual ~EventBase() = default;
};
template<const char* type_name>
struct EventModel : EventBase
{
    const std::string& type() const override {
        static const std::string _ { type_name };
        return _;
    }
};
constexpr char hello[] = "hello";
constexpr char world[] = "world";
int main(int argc, const char * argv[]) {
    auto p1 = std::make_unique<EventModel<hello>>();
    auto p2 = std::make_unique<EventModel<world>>();
    std::cout << p1->type() << std::endl;
    std::cout << p2->type() << std::endl;
    return 0;
}

现在您有许多选择消息类型的选项:

bool is_hello_slow(const EventBase& e)
{
    return e.type() == hello;
}
bool is_hello_medium(const EventBase* pe)
{
    return dynamic_cast<const EventModel<hello>*>(pe);
}
template<class Event>
bool is_hello_compile_time(const Event&) {
    return std::is_base_of<EventModel<hello>, Event>();
}