Edit:如果需要,可以使用更多上下文来突出显示实际问题。
我想实现以下方法:
template <typename T>
<unspecified> type_identification();
对于泛型类型 T,它必须返回一个(相对)唯一的标识,该标识在同一程序的多次调用中保持稳定,并且可用于进程间通信(因此没有基于指针的解决方案)。
可以使用编译器特定的宏/扩展/内部函数,最好适用于 MSVC 和 clang。
我考虑过std::type_info::hash_code
, or std::type_info::name
但这两者都不能保证同一程序的多次调用具有相同的输出。
试图避免XY-问题通过立即解释我试图解决的问题。
我已经编写了代码来一般将数据存储在文件中以供以后使用。文件中的每个所谓的条目都由应用程序代码分配一个标签,应用程序代码必须使用该标签在以后的程序调用中访问相同的条目。 API 基本上可以归结为:
template <typename T>
void make(const std::string &name, T value);
template <typename T>
T get(const std::string &name);
请注意,这只是示例代码。
当应用程序代码通过以下方式访问值时get<T>
,它显式指定条目的类型,以便实现可以使用reinterpret_cast
将条目作为实际类型而不是作为void *
.
为了这个问题,让我们假设所有的危险和陷阱reinterpret_cast
并已考虑到将数据保存到文件中。
为了避免由于应用程序代码弄乱了模板参数而导致严重崩溃,我想向文件中的每个条目添加一些类型标识。基本上,当应用程序代码执行以下操作时:
make("integer", 5);
auto a = get<std::string>("integer");
我想抛出一个异常,指示实际类型和请求类型不匹配。