如何使reinterpret_cast更安全?

时间:2018-01-24 09:51:12

标签: c++ templates casting

假设我们有这个功能模板:

template<typename T, typename... Args>
T* creator(const Args&... args)
{
  return new T{args...};
}

现在我想在某个容器中保存一些指向此模板实例的指针。为此,我制作了reinterpret_cast<void*>(creator<type_a, type_b, etc>)。但是当我进行反向操作时,我可以进行一些检查以确保此操作是否安全。即一个(先前保存的)指向void的指针是否实际指向我们试图转换为的模板实例?

可能还需要保存某种类型的信息,而不仅仅是void*。或类似的东西。

修改

实际上,此模板是类模板的私有静态成员。其实例化的指针保存在std::unordered_map<std::string, void*>中。它们用另一种方法调用:

template<typename... Args>
T* create(const std::string& id, const Args&... args)
try
{
  return reinterpret_cast<T* (*)(const Args&...)>(_creators.at(id))(args...);
}
catch(...)
{
  return nullptr;
}

在这里,我可以检查_creator中是否注册了具体的_creators实例。

0 个答案:

没有答案