【问题标题】:Is There a Good Pattern for Creating a Unique Id based on a Type?是否有基于类型创建唯一 ID 的好模式?
【发布时间】:2010-03-16 20:49:27
【问题描述】:

我有一个模板,它为它所实例化的每种类型创建一个唯一标识符。这是模板的简化版本:

template <typename T>
class arType {
  static const arType Id; // this will be unique for every instantiation of arType<>.
}

// Address of Id is used for identification.
#define PA_TYPE_TAG(T) (&arType<T >::Id)

当您有一个纯粹由静态库组成的可执行文件时,这很有效。不幸的是,我们正在转向由 dll 组成的可执行文件。每个 dll 都可能有自己的类型的 Id 副本。

一个明显的解决方案是显式实例化 arType 的所有实例。不幸的是,这很麻烦,请问有没有人可以提出更好的解决方案?

【问题讨论】:

  • 一个明显的问题是“你为什么认为你需要这样做?”
  • 我希望能够在运行时存储一个唯一标识符并将其用于比较。我们使用它的一个地方是类型之间的转换表。
  • @Michael 我们中的许多人一直在管理我们所有职业的类型都没有唯一的 ID。你真的认为你有一些需要他们的独特问题吗?我并不是要无礼 - 我建议你问一个关于你的潜在问题的问题,而不是你认为的解决方案。
  • @Johannes:什么?另一个问题不涉及一致性问题。

标签: c++ metaprogramming


【解决方案1】:

从每个对象的函数中返回一个 std::type_info 对象,并在结果上使用 operator ==。您可以使用返回排序顺序的 before() 函数对它们进行排序。

它专为满足您的需求而设计。如果你想隐藏它在下面的工作方式,你可以用一个不透明的“id”类型将它包装起来。

http://www.cplusplus.com/reference/std/typeinfo/type_info/

【讨论】:

  • 这就是我最终做的事情,它似乎完成了这项工作。不像指针检查那么快,但是哦,好吧......
【解决方案2】:

是的,而且比你想象的要简单:

template<...> class withAnID {
    static void idFunction(){};
}

用法:

&withAnID<...>::idFunction;

由于模板的每个实例都有自己的程序集,因此每个函数都有一个唯一的(可排序的!)地址,您可以使用它来识别它们。

【讨论】:

  • 跨 DLL 的?我不这么认为。这与 OP 的解决方案没有什么不同。
  • 感谢 Narfanator,但 GMan 是正确的。我正在寻找适用于 DLL 的解决方案。
【解决方案3】:

好吧,我认为唯一的方法是编写一个考虑 DLL 问题的处理 Id 的方法:)

我的意思是,如果您可以将全局类型 ID 计算为“DLL Id”+“DLL 本地类型 ID”,那么您就有了您想要的。我认为如果您管理 DLL 加载部分或者操作系统给您回调来管理它,这可能是可行的。如果您可以在 DLL 绑定对象中设置唯一 ID,您就完成了;-)

我不是 Windows DLL 管理方面的专家,但我记得有类似“on_dll_load”回调的东西可以解决问题。有 DLL 管理专家吗?

只要我的 2 美分 ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多