坚持将C ++类型信息归档以在程序调用中使用

时间:2018-08-13 17:02:55

标签: c++ c++17

编辑:根据需要突出显示实际问题并提供更多背景信息。

我要实现以下方法:

template <typename T>
<unspecified> type_identification();

对于通用类型T,它必须返回(相对)唯一的标识,该标识在同一程序的多次调用中稳定,并且可以用于进程间通信(因此,没有基于指针的解决方案)。

可以使用特定于编译器的宏/扩展名/内部函数,最好同时用于MSVC和clang。

我已经考虑过std::type_info::hash_codestd::type_info::name,但两者都不能保证通过同一程序的多次调用获得相同的输出。


尝试通过立即说明我要解决的问题来避免XY-problem

我编写了将代码一般存储在文件中以供以后使用的代码。文件中的每个所谓条目都由应用程序代码分配了一个标签,在以后的程序调用中,该代码必须用于访问同一条目。该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将访问权限作为实际类型而不是{ {1}}。

为了这个问题,让我们假设已考虑到与void *有关的所有危险和陷阱,并保留了要归档的数据。

为避免由于应用程序代码弄乱了模板参数而导致的严重崩溃,我想向文件中的每个条目添加一些类型标识。基本上,当应用程序代码执行以下操作时:

reinterpret_cast

我想抛出一个异常,指示实际类型和请求的类型不匹配。

1 个答案:

答案 0 :(得分:2)

您可以添加代码以定义要保留的类型的永久名称。

template <typename T> struct persistent_type;

template <> struct persistent_type<int>
{
   static std::string_view name() { return "int"; }
}

template <> struct persistent_type<double>
{
   static std::string_view name() { return "double"; }
}

并在make

中使用它们
template <typename T>
void make(std::string_view name, T value)
{
   // Save the type name of the data, persistent_type<T>::name()

   // Save the name of the data, name

   // Save the data, value
}

获取值时,使用

template <typename T>
T get(std::string_view name)
{
   // Read the type name and make sure it is equal to persistent_type<T>::name().

   // Rest of your logic to read the object
}