Как проверить тип объекта в C ++ / CLI? - PullRequest
10 голосов
/ 09 марта 2010

Есть ли простой способ проверить тип объекта? Мне нужно что-то вроде следующего:

MyObject^ mo = gcnew MyObject();
Object^ o = mo;

if( o->GetType() == MyObject )
{
    // Do somethine with the object
}
else
{
    // Try something else
}

В данный момент я использую вложенные блоки try-catch, ища System::InvalidCastException s, которые кажутся уродливыми, но работают. Я собирался попытаться профилировать что-то вроде приведенного выше кода, чтобы увидеть, будет ли он быстрее / медленнее / читабельнее, но не может выработать синтаксис, чтобы даже попробовать.

В случае, если кому-то интересно, это связано с наличием единой очереди, входящей в поток, который предоставляет данные для работы. Иногда я хочу изменить настройки и передать их через очередь данных - это простой способ сделать это.

Ответы [ 3 ]

26 голосов
/ 11 марта 2010

Вы можете использовать MyObject::typeid в C ++ / CLI так же, как typeof(MyObject) используется в C #. Код ниже беспардонно скопирован с вашего вопроса и изменен ...

MyObject^ mo = gcnew MyObject();
Object^ o = mo;

if( o->GetType() == MyObject::typeid )
{
    // Do somethine with the object
}
else
{
    // Try something else
}
9 голосов
/ 09 марта 2010

Вы должны проверить Как: реализовать и использовать ключевые слова C # в C ++ :

В этом разделе показано, как реализовать функциональность ключевых слов is и C # вVisual C ++.

0 голосов
/ 09 марта 2010

edit: Я оставлю это здесь. Но этот ответ для C ++. Вероятно, даже не связано с этим для CLI.

Вам необходимо скомпилировать с RTTI (информация о типе времени выполнения). Затем посмотрите статью в Википедии http://en.wikipedia.org/wiki/Run-time_type_information и поищите в Google RTTI. Должен работать на вас.

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

...