强制转换为未知模板类型

Cast to an unknown template type

本文关键字:类型 未知 转换      更新时间:2023-10-16

所以我看到了这样的代码:

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个字节,将它强制转换为ResponseMessage。这是正确的吗?

我不完全确定我是否理解这个问题,但我想你在问编译器如何知道你想转换为什么类型,因为参数总是Message&

它不会根据大小自动选择:断言是用来捕捉程序员错误的。

当您调用函数时,您必须手动指定您想要的类型:safe_ptr_cast<RequestMessage>(msg)

编辑:我本来想评论一下,你可能想看看虚拟函数,因为它们可能更合适(至少在一种情况下,我可以想象你会有这样的函数)。

由于无法根据传递的参数确定模板类型,因此编译器不会尝试确定模板参数

它必须在调用站点上明确指定。

safe_ptr_cast<TheType>(msg);