Приведение к неизвестному типу шаблона - PullRequest
0 голосов
/ 04 января 2012

Итак, я увидел такой код:

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 есть подкласс RequestMessage с некоторыми дополнительными членами, подкласс ResponseMessage с некоторыми дополнительными членамитакже.Я предполагаю, что размер RequestMessage равен 50 байтов, а ResponseMessage равен 100 байтов.После приведения, если объект msg имеет 50 байтов, он будет приведен к RequestMessage, а если объект msg имеет 100 байтов, он будет приведен к ResponseMessage.Это правильно?

Ответы [ 2 ]

2 голосов
/ 04 января 2012

Я не совсем уверен, что понимаю вопрос, но я думаю, что вы спрашиваете, как компилятор узнает, к какому типу вы хотите привести, потому что параметр всегда равен Message&

не выбирается автоматически в зависимости от размера: существует утверждение, чтобы отлавливать ошибки программиста.

Вы должны вручную указать, какой тип вы хотите при вызове функции: safe_ptr_cast<RequestMessage>(msg)

РЕДАКТИРОВАТЬ:Я хотел прокомментировать, что вы можете захотеть взглянуть на виртуальные функции, потому что они могут быть более подходящими (по крайней мере, в одной ситуации, я могу представить, где у вас будет такая функция).

1 голос
/ 04 января 2012

Поскольку тип шаблона не может быть определен из передаваемого параметра, компилятор не будет пытаться определить параметр шаблона.

Должен быть явно указан на сайте вызова.

safe_ptr_cast<TheType>(msg);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...