有问题从const void *转换为带有LLVM的模板类型

时间:2017-11-12 18:12:37

标签: c++ templates casting llvm void-pointers

我在使用LLVM编译以下函数时遇到问题,在MSVC中编译完全正常。

template<typename Fn>
Fn GetVFunction(const void *instance, std::size_t index) {
    const auto vtable = *reinterpret_cast<const void***>(const_cast<void*>(instance));
    return reinterpret_cast<Fn>(vtable[index]);
}

发生以下错误:

 "reinterpret_cast from 'const void *' to 'SDK::UObject *(*)(SDK::UClass *)' casts away qualifiers"

我环顾四周,建议做以下事项 -

return const_cast<Fn>(reinterpret_cast<const Fn>(vtable[index]));

导致了同样的问题。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

由于模板瞬间出现问题,您的错误无法重现,但我认为以下情况应该有效

template<typename Fn>
Fn GetVFunction(const void *instance, std::size_t index) {
    auto vtable = reinterpret_cast<void**>(const_cast<void*>(instance));
    return reinterpret_cast<Fn>(vtable[index]);
}

请注意,void*操作通常是C ++中编码不良的一个标志(因为它容易出错),但在C中很常见(缺少类型安全的通用编程)