Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Преобразование типов


Автор: itan 18.12.2007, 14:00
Предположим у меня есть функция, которая может возвращать указатели разных типов, приведенные к int:
Код

int func(int icase)
{
     switch(icase)
     {
        case 1 :  return (int)( new A() );
        case 2:   return (int)( new B() );
     }
return 0;
}


Какой cast надо использовать, чтобы узнать какой имеено тип указателя вернулся?

Автор: Sartorius 18.12.2007, 14:26
Цитата

Какой cast надо использовать, чтобы узнать какой имеено тип указателя вернулся?

 Эта информация в стеке не сохраняется. или возвращай структуру, содержащую тип указателя, либо запоминай, что передал в точке вызова.

 ЗЫ Возвращай хотя бы void*. А то Int как то странно выглядит в этой роли
 ЗЗЫ если включен RTTI - dynamic_cast может помочь

Автор: zkv 18.12.2007, 14:26
Цитата(itan @  18.12.2007,  14:00 Найти цитируемый пост)
Какой cast надо использовать, чтобы узнать какой имеено тип указателя вернулся? 

чтобы узнать, как-то так:
Код

#include <iostream>

struct Base
{
    virtual ~Base(){}
};
struct A : public Base{};
struct B : public Base{};

Base *func(int icase)
{
    switch(icase)
    {
    case 1 :  return new A();
    case 2:   return new B();
    }
    return 0;
}

int main()
{
    Base *p = func(2);

    if( dynamic_cast<A *>( p ) )        
    {
        std::cout<<"A";
        delete p;
    }
    else if( dynamic_cast<B *>( p ) )        
    {
        std::cout<<"B";
        delete p;
    }
    else
    {
        std::cout<<"Error";
    }

    std::cin.get();
}


если только привести, то reinterpret_cast. 

Автор: archimed7592 18.12.2007, 15:51
Ну, а если типы не имеют общего полиморфного базового типа, то можно воспользоваться механизмом исключений:
Код

void foo(int c)
{
    if (c)
        throw new A;
    else
        throw new B;
}

int main()
{
  int c;
  std::cin >> c;
  try { foo(c); }
  catch(A *)
  { ... }
  catch(B *)
  { ... }
}

Здесь, правда, кроются другие грабли - во-первых, т.к. механизм исключений используется не по назначению, то может появится нехилый оверхэд, во-вторых, если типы всё же имеют общий базовый, то расставив catch в неправильном порядке, можно получить не совсем то поведение, на которое расчитывалось smile.

Добавлено через 58 секунд
Что-то я туплю - тут же boost::any - то что доктор прописал smile.

Автор: Alek86 18.12.2007, 15:56
archimed7592, ты зачем человека пугаешь? smile
спрашивали ж, какой каст...

Автор: archimed7592 18.12.2007, 16:00
Цитата(Alek86 @  18.12.2007,  15:56 Найти цитируемый пост)
спрашивали ж, какой каст... 

В общем случае такого каста нет, как и было сказано выше smile.

Автор: Alek86 18.12.2007, 16:32
нда, не вчитался в вопрос...
itan, если уж извращаешься, то ты ведь САМ задаешь, какой указатель вернется, зачем его тебе определять?

кстати, 200% ты чего-то неправильно представляешь и твоя задача решается намного проще

Автор: zkv 18.12.2007, 16:38
Цитата(Alek86 @  18.12.2007,  16:32 Найти цитируемый пост)
кстати, 200% ты чего-то неправильно представляешь и твоя задача решается намного проще

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)