是否有基于类型创建唯一ID的良好模式?

时间:2010-03-16 20:49:27

标签: c++ metaprogramming

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

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的所有实例。不幸的是,这很麻烦,我想问一下是否有人可以提出更好的解决方案?

3 个答案:

答案 0 :(得分:1)

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

它专为满足您的需求而设计。您可以将它包装在一个不透明的“id”类型中,并带有一个运算符&lt;如果你想隐藏它在下面的工作方式。

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

答案 1 :(得分:0)

是的,这比你想象的要简单:

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

用法:

&withAnID<...>::idFunction;

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

答案 2 :(得分:0)

嗯,我认为唯一的方法是编写一个处理ID的方法,考虑到DLL问题:)

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

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

只是我的2美分......