我有一个模板,可以为其实例化的每种类型创建唯一标识符。这是模板的简化版本:
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的所有实例。不幸的是,这很麻烦,我想问一下是否有人可以提出更好的解决方案?
答案 0 :(得分:1)
从每个对象的函数返回一个std :: type_info对象,并对结果使用operator ==。您可以使用before()函数对它们进行排序,该函数返回整理顺序。
它专为满足您的需求而设计。您可以将它包装在一个不透明的“id”类型中,并带有一个运算符&lt;如果你想隐藏它在下面的工作方式。
答案 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美分......