转换为未知模板类型

时间:2012-01-04 03:37:40

标签: c++ templates

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

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个字节,ResponseMessage100个字节。在转换时,如果msg对象有50个字节,它将被强制转换为RequestMessage,如果msg对象有100个字节,它将被强制转换为{{ 1}}。这是对的吗?

2 个答案:

答案 0 :(得分:2)

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

它不会根据大小自动选择:断言是为了捕获程序员错误。

您必须在调用该函数时手动指定所需的类型:safe_ptr_cast<RequestMessage>(msg)

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

答案 1 :(得分:1)

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

必须在呼叫站点明确指定。

safe_ptr_cast<TheType>(msg);