用元数据标记C 类实例
Tagging C++ class instances with metadata
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>();
}
相关文章:
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 以非特权用户身份查询 NTFS 特殊文件的元数据?
- 如何使用 Google Test 向测试添加元数据 / 如何将数据从 Google Test 发送到 TestEven
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- 从模板创建通用打印函数,以打印基元数据类型变量的值
- 在 C++ 中修改 Grpc 双向流式处理期间的元数据
- cpp / c ++中的grpc客户端代码,元数据x-api-key/x-goog-api-key不起作用,给了我语音A
- 如何使用gRPC在客户端和服务器之间双向发送和接收流元数据
- 即使基类和派生类只使用基元数据类型,我是否需要定义虚拟析构函数
- 如何处理错误"E1696命令行错误:无法在Visual Studio 2017中打开元数据文件"mscorlib.dll"?
- 元数据操作失败LNK2022错误 (8013118D):重复类型中的布局信息不一致 (选择设备参数):(0x020002
- C++11 标准中的哪一部分规定了基元数据类型大小之间的相对顺序?
- 使用 ffmpeg 添加元数据信息
- WIC - Exif 元数据查询 - 如何获取图像说明
- 从Qt应用程序读取元数据
- 如何将编译时元数据/行为添加到特定函数
- 从编码域中的 MPEG 文件中读取元数据
- 在C 中显示图像及其元数据
- 如何用libcurl定义元数据
- 用元数据标记C 类实例