【发布时间】:2015-04-15 22:42:01
【问题描述】:
我想将一些const void*对象转换成函数指针:
std::unordered_map<std::string, const void*> originals_;
template <typename R, typename... Args>
R CallOriginal(const std::string& name, Args... args) {
return reinterpret_cast<R (*const)(Args...)>(originals_[name])(args...);
}
但是,令我惊讶的是,我收到以下错误消息:
错误:将“mapped_type”(又名“const void *”)重新解释为 'int (*const)(int)' 抛弃限定符
首先,使用const 函数指针是否有意义?
如果是这样,那我怎样才能合法地进行选角?
【问题讨论】:
-
你为什么要强制指向
const void*的函数指针首先将它们存储在地图中?为什么不只存储函数指针? -
因为我想存储指向具有不同签名的函数的指针。此外,我用来操作函数指针的库确实将它们转换为
void*并接受它们为void const*。 -
这听起来像是个糟糕的主意。由于函数类型在编译时是已知的,因此它们的数量只能是有限的,因此您应该为每种类型都有一个单独的映射。不要对抗类型系统;让它为你工作。我一直不明白为什么人们试图将 C++ 当作一种动态类型的语言来使用。
-
@Brian 问题不在于想法,而在于语法和好奇心。而且我不希望每个单独签名的映射,我希望所有函数替换的映射按其名称 - 不要将唯一的函数指针存储在单独的变量中,否则,这真的很糟糕。我也使用第三方 C 库,AFAIK 在 C 中将所有内容转换为
void*并不像在 C++ 中那么糟糕。 -
intel 15.0.2 也允许这样做。当然,关于这种转换的一切都是实现定义的(根据
5.2.10[expr.reinterpret.cast]/8)
标签: c++ c++11 casting constants function-pointers