LINUX.ORG.RU

[c++] typeid. Заставить возвращать число?

 


0

3

Есть такая функция(?), которая возвращает имя типа переменной

Пример:

#include <typeinfo>
#include <iostream>

class MyClass
{};

int main()
{
    int i=0;
    MyClass a;
    std::cout << typeid(i).name() << std::endl;
    std::cout << typeid(a).name() << std::endl;
    return 0;
}

Итог:

i
7MyClass

Как видно для int она вернула i, и это удобно т.к. для варианта в switch переменная типа char отлично подходит. А вот для класса она вернула полное его Название и количество буков в нём, а это уже не хорошо т.к. для запихивания в свич строка не подходит, поэтому нужно вернуть номер, но как?

P.S. Сравнение строк не пройдёт - производительность упадёт во много раз, что критично для выполнения в реальном времени.

#include <cstdio>
#include <typeinfo>

class MyClass
{};

int main()
{
    MyClass a, b;
    printf( "%d\n", (int) typeid(a).name() );
    printf( "%d\n", (int) typeid(b).name() );

    return 0;
}

вот тебе число - раз уж хочется извращаться

aho
()
Ответ на: комментарий от true_admin

В функции есть аргумент, являющийся классом-родителем, хотя сам он не может быть обработан, его классы-наследники могут. Задача функции состоит в определении столкновений между такими объектами, как вектор, куб, сфера, квадрат и треугольник - классами наследниками.

Функция определяет тип объектов и выбирает вариант свича, после чего возвращает логическое значение и пихает в указатель глубину проникновения.

Свичи должны переключаться в зависимости от типа. А тип определяется переменной.

NaViKotE
() автор топика
Ответ на: комментарий от NaViKotE

> В функции есть аргумент, являющийся классом-родителем

виртуальный метод, возвращающий константу, тебе нужен

aho
()
Ответ на: комментарий от NaViKotE

> Задача функции состоит в определении столкновений между такими объектами, как вектор, куб, сфера, квадрат и треугольник - классами наследниками

Multiple dispatch?

kamre ★★★
()
Ответ на: комментарий от aho

Ошибка.

cast fom «const char*» to «int» loses precision [-fpermissive]

NaViKotE
() автор топика
Ответ на: комментарий от NaViKotE

> Свичи должны переключаться в зависимости от типа. А тип определяется переменной.

Плюсплюсеры познают необходимость нормальных ЯП.

anonymous
()

Оказывается switch его глотает и без чисел, но вот беда - всё время (вне зависимости от наследника) возвращает значение класса-родителя... Что делать?

NaViKotE
() автор топика
Ответ на: комментарий от Boy_from_Jungle

В смысле - название всех переменных, которые на него указывают?
Или я не верно понял вопрос?

trex6 ★★★★★
()
Ответ на: комментарий от NaViKotE

>Задача функции состоит в определении столкновений между такими объектами, как вектор, куб, сфера, квадрат и треугольник - классами наследниками.

Визитор заюзай, не городи костылей. typeid() он вообще практически не нужен, ибо.

yoghurt ★★★★★
()
Ответ на: комментарий от vertexua

>Матрица ссылок на функции для всех типов, каждый с каждым - это самое быстрое

И по какому принципу ты определишь, какой элемент матрицы надо юзать для данной комбинации аргументов?

yoghurt ★★★★★
()
Ответ на: комментарий от NaViKotE

typeid работает в compile time, так что, грубо говоря, как ты переменную объявил, такой тип и будет, независимо от того, на что в действительности она ссылается, т.к. это только в рантайме узнать можно.

ratatosk
()

Можете считать, что у меня ООП головного мозга, но я всегда считл, что если мне захотелось воспользоваться typeid или чем-то подобным, то я где-то очень сильно неправ. Пока всегда удавалось сделать изящнее и понятнее другими способами, может просто везло.

Gvidon ★★★★
()
Ответ на: комментарий от Boy_from_Jungle

Так и не понял, что вы имеете ввиду под именем объекта. Вот например:

class A
{
public:
    int i;
}


void foo()
{
    A *a = new A();
    foo2(a);
}

void foo2(A* myA)
{
  ???
}

Что должно выводиться в функции foo2(...) как имя объекта myA?

trex6 ★★★★★
()
Ответ на: комментарий от Gvidon

typeid можно использовать для отладки

или для очень больших хаков

namezys ★★★★
()
Ответ на: комментарий от Gvidon

>если мне захотелось воспользоваться typeid или чем-то подобным, то я где-то очень сильно неправ
Полностью поддерживаю.

trex6 ★★★★★
()
Ответ на: комментарий от vertexua

Кстати, как в Smalltalk приделать красивую и мощную множественную диспетчеризацию, как в CLOS, я пока так и не придумал.

А насчёт «ехать» в лучшем виде - это у Александреску описано, тут уже давали ссылку

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

Когда он использовал слова Modern С++, о что хотел сказать?

vertexua ★★★★★
()

Костыли и подпорки детектед.

elverion
()

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

Как регистрировать типы смотри в Qt.

elverion
()
Ответ на: комментарий от ratatosk

Объект, кроме того, должен иметь общего предка - иначе ты его вообще не куда не положишь.

namezys ★★★★
()
Ответ на: комментарий от Boy_from_Jungle

А в этом случае:
[code=cpp]
class A
{
public:
int i;
}


void foo()
{
A *prst = new A();
A* a = prst;
A* b = a;
foo2(b);
}

void foo2(A* myA)
{
???
}
[/code]

trex6 ★★★★★
()
Ответ на: комментарий от namezys

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

Boy_from_Jungle ★★★★
()
Ответ на: комментарий от namezys

я за такое спрашивал
Object a;

someMethod(Object& )
{
Name object is 'a'?;
}

Вот и всё, без всяких выебон*в, реально такое сделать,
чисто спортивный интерес.

Boy_from_Jungle ★★★★
()
Ответ на: комментарий от NaViKotE

Торвальдс плакал от такого С++ и таких программистов.

bk_ ★★
()
Ответ на: комментарий от Boy_from_Jungle

Т.е. хочется узнать имя переменной в коде, для которой впервые был сконструирован объект?
А Вы в курсе, что имена переменных в бинарном файле не сохраняются?
В виде исключения, кончено, можно включить в бинарник отладочную информацию, но читать ее из кода, а не средствами отладчика...
Вам явно хочется странного.

Но у меня сложилось стойкое впечатление, что это просто тонкий троллинг.

trex6 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.