Форум программистов, компьютерный форум CyberForum.ru

Получения количества полей класса - C++

Восстановить пароль Регистрация
 
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
13.08.2012, 14:53     Получения количества полей класса #1
Предположим, что я делаю шаблонную функцию для простого сложения. Если мне посылаются int и double, я просто складываю не акцентируя внимание на округлении. Если же мне посылается в функцию структура point (в которой три поля) и vector (в котором так же три поля, но это уже другая структура, а не "задефайненная" point), то как я могу сложить отдельно их поля по порядку их объявления? Пытался адресной арифметикой сделать, передавая в функцию ещё кол-во полей, но не вышло :< То ли я глупый, то ли так нельзя
p.s Тип полей в одной структуре одинаков, т.е, если point.x - int, то и остальные два поля тоже int
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Пaтрик
 Аватар для Пaтрик
394 / 387 / 38
Регистрация: 21.01.2012
Сообщений: 972
Завершенные тесты: 1
13.08.2012, 14:59     Получения количества полей класса #2
Сделать перегрузку функций. В случае если объект структуры point будет приводится к int, функция должна возвращать сумму полей.
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
13.08.2012, 15:03     Получения количества полей класса #3
Если я всё правильно понял, то вам нужно просто специализировать шаблонную функцию для ваших классов:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template <class T>
T sum(T t1, T t2)
{
    return t1 + t2;
}
template <>
Point sum(Point p1, Point p2)
{
   Point temp;
   temp.x = p1.x + p2.x;
   temp.y = p1.y + p2.y;
   temp.z = p1.z + p2.z;
   return temp;
}
Ну или же переопределить оператор + для класса Point, тогда никаких специализаций функции sum не потребуется.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
13.08.2012, 15:18  [ТС]     Получения количества полей класса #4
John Prick, не совсем так. Меня интересует именно тот случай, когда я не знаю названия полей.
Т.е код :
C++
1
2
3
4
5
6
7
8
template <typename T1, typename T2>
void Sum(T1& a, const T2& b, const int n)
{
a.field1 += b.field1;
a.field2 += b.field2;
...
a.fieldN += b.fieldN;
}
где n - кол-во полей в структуре (как я уже говорил, у них одинаковое кол-во полей) (как вариант - получать n в самой функции каким-то способом int n = fieldCount(T1); )
на работу с типами для += можно не обращать внимания, ибо "всё хорошо" (с)
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
13.08.2012, 15:21     Получения количества полей класса #5
опечатался в предыдущем сообщении:
C++
1
2
3
4
5
template <>
Point sum<Point>(Point p1, Point p2)
{
// ...
}
Вот так специализация функции пишется.

Добавлено через 1 минуту
Цитата Сообщение от nexen Посмотреть сообщение
Меня интересует именно тот случай, когда я не знаю названия полей.
Так названия не знаешь или их количество?
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
13.08.2012, 15:29  [ТС]     Получения количества полей класса #6
John Prick, ТТ. Я уже сам себя запутал. Извините.
Названия полей не знаю. Нужно как-то перемещаться по полям экземпляра без знания названий.
и, "как бонус", было бы хорошо узнать, можно ли узнать кол-во полей структуры с разными типами полей? (к перемещению это не относится. перемещаюсь я по однотипной стуктуре)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.08.2012, 16:40     Получения количества полей класса
Еще ссылки по теме:

C++ Ошибка получения переменной класса
C++ Сортировка по одному из полей класса
C++ Доступ к значениям полей класса

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
13.08.2012, 16:40     Получения количества полей класса #7
Названия полей не знаю. Нужно как-то перемещаться по полям экземпляра без знания названий.
Ну тут так сходу решения и не придумать. Либо какой-то хитрый шаблон делать, который ещё на этапе компиляции вычисляет количество полей, либо в структуру добавлять ещё поле, отвечающее за количество полей. Надеяться на распределение полей в памяти, наверное, плохо (ну т.е. делать предположения, что все они лежат подряд друг за другом, брать указатель на структуру, приводить его к типу поля и последовательно проходить таким образом структуру, инкрементируя этот указатель), да и наврядли что получится.

Цитата Сообщение от nexen Посмотреть сообщение
было бы хорошо узнать, можно ли узнать кол-во полей структуры с разными типами полей?
Тут ещё мудрее. Наверное, опять же можно попробовать придумать какой-нибудь шаблон, вычисляющий число полей на этапе компиляции, например, используя sizeof(). Сейчас сходу я такой придумать не смогу.

Добавлено через 11 минут
Хотя, вспоминая Александреску, можно попробовать применить списки типов. Тут дело обстоит примерно так: создаём нужный нам набор из типов
C++
1
typedef TYPELIST_3(int, double, char) MyTypes;
Далее создаём простой шаблонный класс:
C++
1
2
3
4
5
template <class T>
struct Holder
{
    T value;
}
Затем генерируем класс, который будет наследовать от этого шаблона, подставляя ему типы из списка типов. У Александреску такой шаблонны класс называется GenScatterHierarchy:
C++
1
typedef GenScatterHierarchy<MyTypes, Holder> MyStruct;
В результате получим структуру, в которой будет 3 поля, по одному на каждый из типов в списке, т.е. аналогично тому, если бы мы написали:
C++
1
struct MyStruct: public Holder<int>, Holder<double>, Holder<char> {};
только с той лишь разницей, что количество полей (т.е. количество типов в списке типов) можно вычислить в общем виде:
C++
1
int fieldsNumber = Length<MyTypes>::Value;
"Просто", не правда ли.
В общем, то, что вы хотите сделать - в принципе реально, но это уже высший С++ пилотаж. Советую почитать книгу Александреску, главу про списки типов. С первого раза ничерта не понять, но может быть натолкнёт на какие-то мысли.
Yandex
Объявления
13.08.2012, 16:40     Получения количества полей класса
Ответ Создать тему
Опции темы

Текущее время: 02:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru