Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.07.2012, 17:41   #1
mf_fun_mf
Пользователь
 
Регистрация: 20.07.2012
Сообщений: 11
По умолчанию Определение структуры

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

struct a{int x, y;}; struct b{int x;};
a Sa; b Sb;
func(Sa); // Один результат
func(Sb); // Другой результат

Как узнать, что за структуру передали функции?

Добавление дополнительных полей к структурам или определение функцией их размера не предлаать!

Последний раз редактировалось mf_fun_mf; 20.07.2012 в 17:45.
mf_fun_mf вне форума Ответить с цитированием
Старый 20.07.2012, 17:46   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Если на С, тогда придетстя добавлять аргумент в функции и передавать каким то образом тип структуры. Если на С++, тогда пишите несколько функций с одним именем и каждая с разным типом аргумента - для каждой структуры по одной.
waleri вне форума Ответить с цитированием
Старый 20.07.2012, 17:49   #3
mf_fun_mf
Пользователь
 
Регистрация: 20.07.2012
Сообщений: 11
По умолчанию

Как не хочется добавлять доп. инфу в структуры или перегружать функции...
mf_fun_mf вне форума Ответить с цитированием
Старый 20.07.2012, 18:07   #4
rmv240899
Форумчанин
 
Регистрация: 18.02.2012
Сообщений: 155
По умолчанию

Цитата:
Сообщение от mf_fun_mf Посмотреть сообщение
Как не хочется добавлять доп. инфу в структуры или перегружать функции...
И не надо. Юзайте typeid, если это С++.
rmv240899 вне форума Ответить с цитированием
Старый 23.07.2012, 16:27   #5
mf_fun_mf
Пользователь
 
Регистрация: 20.07.2012
Сообщений: 11
По умолчанию

#include <typeinfo.h>

void func(void* ptr)
{
typeid(ptr).name();
typeid(&ptr).name();
}

int a, *pa;
...
func(a); func(pa); func(&a);
...

Кое-что пробовал передовать функции, typeid даёт только "void *" или "void * *". Как правильно её использовать?
mf_fun_mf вне форума Ответить с цитированием
Старый 23.07.2012, 17:16   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Если это C++ напишите две функции:
func(const a& sa) { ... }
func(const b& sb) { ... }

Для того чтоб использовать typeid надо все структуры унаследовать от одного родителя, сделать функцию с указателем на этого родителя и включить в опциях компиляторa RTTI
waleri вне форума Ответить с цитированием
Старый 23.07.2012, 20:20   #7
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Если это C++ напишите две функции:
func(const a& sa) { ... }
func(const b& sb) { ... }

Для того чтоб использовать typeid надо все структуры унаследовать от одного родителя, сделать функцию с указателем на этого родителя и включить в опциях компиляторa RTTI
Ну нужно понимать одну вещь: typeid определяет фактический тип объекта двумя способами:

1. Статическим. Если иерархия не содержит виртуальных методов. И в этом случае вычисления происходят времени компиляции.

(в случае автора, он получит типа предка)

2. Динамическим. Если иерархия содержит виртуальные методы. И в этом случае вычисления происходят времени выполнения. RTTI, как известно - тяжелая операция.

(в случае автора, он получит тайп_ид потомка, но тайп_ид - это ещё не потомок, и придётся городить огород, что бы пропасти реакцию функции на тот, или иной тайп_ид).

А так вообще - имхо, надо быть полным извращенцем, что бы юзать тяжелый RTTI, и городить замороченную инфраструктуру по разветвлениям кода тогда, когда можно обойтись тривиальной перегрузкой.
_Bers вне форума Ответить с цитированием
Старый 23.07.2012, 21:08   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
1. Статическим. Если иерархия не содержит виртуальных методов. И в этом случае вычисления происходят времени компиляции.
Возможно это зависит от реализации на конкретном компиляторе но насколько я знаю typeid и dynamic_cast<> *всегда* вызывают скрытый виртуальный метод.
waleri вне форума Ответить с цитированием
Старый 23.07.2012, 21:14   #9
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Возможно это зависит от реализации на конкретном компиляторе но насколько я знаю typeid и dynamic_cast<> *всегда* вызывают скрытый виртуальный метод.
" Если операнд операции typeid есть разыменованный указатель или ссылка на полиморфный тип, typeid возвращает динамический тип объекта, получаемого по указателю или ссылке на него. Если операнд неполиморфный, typeid вернет объект, представляемый статическим типом. "(ц)


В стандарте не рылся. Но мингв/гцц/судийные компили намекнули мне, что автор цитаты - прав.
И да, кстати, классы, которые не содержат ни одного явного виртуального метода, никаких "скрытых" виртуальных так же не содержат.

Заодно подумай: зачем разработчикам компиляторов придумывать себе такие сложности с объектом, тип которого итак прекрасно вычисляется на этапе компиляции?
_Bers вне форума Ответить с цитированием
Старый 23.07.2012, 21:33   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Уф
class CParent;
class CChild : public CParent;
CParent* ptr = new CChild;
CChild* crash = dynamic_cast<CChild*>(ptr);
typeid(ptr) == ?
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Написание программ (древовидные структуры, структуры неспециального вида и т.д.) Green Gin Фриланс 2 27.04.2012 15:26
Управляющие структуры. Программирование алгоритмов разветвляющейся структуры. Лёнка Компоненты Delphi 1 23.04.2012 15:03
C# определение ф-и Lucky777 Помощь студентам 4 10.06.2011 01:00
Определение по IP ProgDel Работа с сетью в Delphi 3 08.11.2010 22:14
Линейные структуры - что это? (определение) MR_Andrew Помощь студентам 6 07.10.2009 18:38