Как определить в C ++ typeof шаблонадля десериализации данных? - PullRequest
1 голос
/ 29 февраля 2012

Проблема:

How to determine typeof of **managed** template<class T> for deserialize data?
In C# a method to do this is typeof(T) but in C++ is ... ?

Буду признателен за ваше сотрудничество.

строка:

DataContractSerializer^ serializer = gcnew DataContractSerialize(typeof(T));

Сообщения об ошибках

Ошибка 1, ошибка C2275: 'T': недопустимое использование этого типа в качестве выражения c: ... \ SerializationExtensions.h 33 1 iOffshoreSteadyStateEngine

Ошибка 2, ошибка C3861: 'typeof': идентификатор не найден c: ... \ SerializationExtensions.h 33 1 iOffshoreSteadyStateEngine

код:

template<class T>
T SerializationExtensions<T>::Deserialize(System::String^ serialized)
{
    DataContractSerializer^ serializer = gcnew DataContractSerialize(typeof(T));
    StringReader^ reader = gcnew StringReader(serialized);
    XmlTextReader^ stm = gcnew XmlTextReader(reader);
    return (T)serializer->ReadObject(stm);
}

1 Ответ

2 голосов
/ 29 февраля 2012

Эквивалент C # typeof(T) будет T::typeid. Это относится к любому типу курса, а не только к универсальным, поэтому вы также можете сделать это: System::String::typeid.

Кроме того, вы уверены , хотите ли вы использовать template<class T>, а не generic<class T>? Вы можете прочитать о различиях между ними в этом блоге . Одно из отличий состоит в том, что шаблоны создаются во время компиляции, а шаблоны создаются во время выполнения. Из-за этого шаблоны не совместимы между языками там, где используются дженерики. В этом посте есть целый список, я бы посоветовал прочитать его, если вы не уверены.

Вот документация по MSDN для typeid .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...