<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: typeid, RTTI, сравнить объект является ли классом</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/9300.html</link>
    <description>&#091;code&#093;&lt;br&gt;// type_info example&lt;br&gt;#include &amp;lt;iostream&amp;gt;&lt;br&gt;#include &amp;lt;typeinfo&amp;gt;&lt;br&gt;using namespace std;&lt;br&gt;&lt;br&gt;struct Poly_Base &#123;virtual void Member()&#123;&#125;&#125;;&lt;br&gt;struct Poly_Derived: Poly_Base &#123;&#125;;&lt;br&gt;&lt;br&gt;int main() &#123;&lt;br&gt;  // polymorphic types:&lt;br&gt;  Poly_Derived polyderived;&lt;br&gt;  Poly_Base* ppolybase = &amp;polyderived;&lt;br&gt;&lt;br&gt;  cout &amp;lt;&amp;lt; boolalpha &amp;lt;&amp;lt; &quot;same type? &quot;; &lt;br&gt;  cout &amp;lt;&amp;lt; ( typeid(polyderived)==typeid(*ppolybase) ) &amp;lt;&amp;lt; endl &amp;lt;&amp;lt; endl;&lt;br&gt;&#125;&lt;br&gt;&#091;/code&#093;&lt;br&gt;&lt;br&gt;Как правильно сравнить class Poly_Derived == typeid(*ppolybase) ? &lt;br&gt;Т.е. Является ли указатель *ppolybase классом Poly_Derived? &lt;br&gt;Во всех примерах в гугле(и примере выше) создают для этого объект polyderived, но мне он не нужен, зачем эти накладные расходы? Напрямую можно ли сравнить?&lt;br&gt;</description>

<item>
    <title>typeid, RTTI, сравнить объект является ли классом (Fx)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/9300.html#6</link>
    <pubDate>Wed, 14 Dec 2011 00:39:40 GMT</pubDate>
    <description>&amp;gt; &#091;code&#093; &lt;br&gt;&amp;gt; if (dynamic_cast&amp;lt;CDerived*&amp;gt;(b) != NULL) &#123; &lt;br&gt;&amp;gt;     // b is pointer to CDerived &lt;br&gt;&amp;gt; &#125; &lt;br&gt;&amp;gt; &#091;/code&#093; &lt;br&gt;&amp;gt; по идее должно работать во всех компиляторах, ибо стандарт.&lt;br&gt;&lt;br&gt;может кому-то может - это самый верный способ. спасибо JohnProfic&lt;br&gt;&lt;br&gt;вариант с &lt;br&gt;if ( typeid(CDerived)==typeid(*b) )&lt;br&gt;работает для сравнения, но воспользоваться *b как объектом другого класса без dynamic_cast не даст.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>typeid, RTTI, сравнить объект является ли классом (JohnProfic)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/9300.html#5</link>
    <pubDate>Fri, 25 Nov 2011 18:31:24 GMT</pubDate>
    <description>&#091;code&#093;&lt;br&gt;if (dynamic_cast&amp;lt;CDerived*&amp;gt;(b) != NULL) &#123;&lt;br&gt;    // b is pointer to CDerived&lt;br&gt;&#125;&lt;br&gt;&#091;/code&#093;&lt;br&gt;по идее должно работать во всех компиляторах, ибо стандарт.&lt;br&gt;</description>
</item>

<item>
    <title>typeid, RTTI, сравнить объект является ли классом (Fx)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/9300.html#4</link>
    <pubDate>Wed, 23 Nov 2011 19:01:18 GMT</pubDate>
    <description>&lt;br&gt;&amp;gt; А нельзя ли добавить виртуальный метод в базовый класс, и переопределить его &lt;br&gt;&amp;gt; в выведенных классах?&lt;br&gt;&amp;gt; и потом вместо цепочки if-else if-else if просто визвать этот виртуальный метод: &lt;br&gt;&amp;gt; ppolybase = &#091;создать или получить откуда-то извне указатель на выведенный из Poly_Base &lt;br&gt;&amp;gt; обьект&#093;; &lt;br&gt;&amp;gt; ppolybase-&amp;gt;doSomething(); &lt;br&gt;&amp;gt; В принципе виртуальные методы для этого и придуманы были - чтобы избавиться &lt;br&gt;&amp;gt; от длинных цепочек if-else которые проверяют тип обьекта...&lt;br&gt;&lt;br&gt;было бы красиво, но в данном случае связь у виртуальных классов очень надуманая. один - просто контейнер для string, а второй контейнер для параметров основываясь на которых другая совсем часть кода делает свою работу. т.е. зауши притянуто будет, и эти виртуальные классы хранители информации разжирнеют.&lt;br&gt;&lt;br&gt;вообще я нашел, похоже, решение... методом научного тыка... и она оказалось очень простым. &lt;br&gt;незнаю насколько это верно и валидно, ниодного такого примера в гугле не нашел, когда имя класса напрямую в typeid сували( не объект), но под виндой ком</description>
</item>

<item>
    <title>typeid, RTTI, сравнить объект является ли классом (elvenic)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/9300.html#3</link>
    <pubDate>Wed, 23 Nov 2011 17:57:45 GMT</pubDate>
    <description>&lt;br&gt;&amp;gt; if ( *ppolybase == Class Poly_Derived) &lt;br&gt;&amp;gt; &#123; &lt;br&gt;&amp;gt;  // делаем 1 &lt;br&gt;&amp;gt; &#125; &lt;br&gt;&amp;gt; else if ( *ppolybase == Class Poly_DerivedTwo) &lt;br&gt;&amp;gt; &#123; &lt;br&gt;&amp;gt;  // делаем 2 &lt;br&gt;&amp;gt; &#125; &lt;br&gt;&lt;br&gt;А нельзя ли добавить виртуальный метод в базовый класс, и переопределить его в выведенных классах?&lt;br&gt;&lt;br&gt;class Poly_Base &lt;br&gt;&#123;&lt;br&gt;  virtual doSomething();&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;class Poly_Derived&lt;br&gt;&#123;&lt;br&gt;  virtual doSomething()&lt;br&gt;  &#123;&lt;br&gt;    // делаем 1&lt;br&gt;  &#125;&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;class Poly_DeruivedTwo&lt;br&gt;&#123;&lt;br&gt;  virtual doSomething()&lt;br&gt;  &#123;&lt;br&gt;    // делаем 2&lt;br&gt;  &#125;&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;и потом вместо цепочки if-else if-else if просто визвать этот виртуальный метод:&lt;br&gt;&lt;br&gt;ppolybase = &#091;создать или получить откуда-то извне указатель на выведенный из Poly_Base обьект&#093;;&lt;br&gt;ppolybase-&amp;gt;doSomething();&lt;br&gt;&lt;br&gt;В принципе виртуальные методы для этого и придуманы были - чтобы избавиться от длинных цепочек if-else которые проверяют тип обьекта...&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>typeid, RTTI, сравнить объект является ли классом (Fx)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/9300.html#2</link>
    <pubDate>Wed, 23 Nov 2011 15:27:16 GMT</pubDate>
    <description>&lt;br&gt;&amp;gt;&amp;gt; Как правильно сравнить class Poly_Derived == typeid(*ppolybase) ?&lt;br&gt;&amp;gt;&amp;gt; Т.е. Является ли указатель *ppolybase классом Poly_Derived?&lt;br&gt;&amp;gt;&amp;gt; Во всех примерах в гугле(и примере выше) создают для этого объект polyderived, &lt;br&gt;&amp;gt;&amp;gt; но мне он не нужен, зачем эти накладные расходы? Напрямую можно &lt;br&gt;&amp;gt;&amp;gt; ли сравнить?&lt;br&gt;&amp;gt; dynamic_cast?&lt;br&gt;&lt;br&gt;спасибо. подходит, но не совсем. Может еще варианты?&lt;br&gt;&lt;br&gt;не организовать удобное ветвление программы, если у базового класса например 5 классов-наследников:&lt;br&gt;&lt;br&gt;if ( *ppolybase == Class Poly_Derived)&lt;br&gt;&#123;&lt;br&gt; // делаем 1&lt;br&gt;&#125;&lt;br&gt;else if ( *ppolybase == Class Poly_DerivedTwo)&lt;br&gt;&#123;&lt;br&gt; // делаем 2&lt;br&gt;&#125;&lt;br&gt;&lt;br&gt;на вскидку, с dynamic_cast прийдется создать 5 лишних указателей, и сделать до 5 попыток dynamic_cast, чтобы понять какой это класс. 5 лишних указателей, конечно, лучше чем создание 5 лишних объектов, но не элегантно как-то...&lt;br&gt;&lt;br&gt;есть какие-то еще возможности?&lt;br&gt;</description>
</item>

<item>
    <title>typeid, RTTI, сравнить объект является ли классом (meantraitor)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/9300.html#1</link>
    <pubDate>Wed, 23 Nov 2011 14:46:19 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;   Poly_Base* ppolybase = &amp;polyderived; &lt;br&gt;&amp;gt;   cout &amp;lt;&amp;lt; boolalpha &amp;lt;&amp;lt; &quot;same type? &quot;; &lt;br&gt;&amp;gt;   cout &amp;lt;&amp;lt; ( typeid(polyderived)==typeid(*ppolybase) ) &amp;lt;&amp;lt; endl &amp;lt;&amp;lt; endl; &lt;br&gt;&amp;gt; &#125; &lt;br&gt;&amp;gt; &#091;/code&#093; &lt;br&gt;&amp;gt; Как правильно сравнить class Poly_Derived == typeid(*ppolybase) ?&lt;br&gt;&amp;gt; Т.е. Является ли указатель *ppolybase классом Poly_Derived?&lt;br&gt;&amp;gt; Во всех примерах в гугле(и примере выше) создают для этого объект polyderived, &lt;br&gt;&amp;gt; но мне он не нужен, зачем эти накладные расходы? Напрямую можно &lt;br&gt;&amp;gt; ли сравнить?&lt;br&gt;&lt;br&gt;dynamic_cast?&lt;br&gt;&lt;br&gt;</description>
</item>

</channel>
</rss>
