所以我看到了这样的代码:
template<class T>
T* safe_ptr_cast(Message& msg) {
assert(msg.header()->size() == T::size());
return msg.header()->size() == T::size ? reinterpret_cast<T*>(msg.dest()) : NULL;
}
如何投射msg
?通常,参数列表需要具有参数类型T
,以便让函数识别要转换的类型。但是,在这种情况下,明确说明参数类型。这是否意味着reinterpret_cast
会将Message类型强制转换为相应的子类?
例如,Message
类有一个子类RequestMessage
,其中包含一些额外的成员,子类ResponseMessage
以及一些其他成员。我假设RequestMessage
的大小为50
个字节,ResponseMessage
为100
个字节。在转换时,如果msg
对象有50个字节,它将被强制转换为RequestMessage
,如果msg
对象有100
个字节,它将被强制转换为{{ 1}}。这是对的吗?
答案 0 :(得分:2)
我不完全确定我理解这个问题,但我想你问的是编译器如何知道你想要转换为什么类型,因为参数总是Message&
它不会根据大小自动选择:断言是为了捕获程序员错误。
您必须在调用该函数时手动指定所需的类型:safe_ptr_cast<RequestMessage>(msg)
编辑:我本来想评论一下你可能想要查看虚函数,因为它们可能更合适(至少在一种情况下我可以想象你在哪里有这样的函数)。
答案 1 :(得分:1)
由于无法根据传递的参数确定模板类型,编译器不会尝试确定模板参数。
必须在呼叫站点明确指定。
safe_ptr_cast<TheType>(msg);