Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
techpriest
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
1

Обход членов класса

18.08.2016, 15:42. Показов 1023. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вопрос:

Возможно ли на С++ вообще написать шаблон, который будет генерировать функцию, производящую одно и тоже действие над каждым членом класса так, как это делается для конструкторов и деструкторов.

т.е.
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
class A {
   int a;
   float b;
   String c;
}
 
int main() {
  A a;
  tmplt(a); 
}
должно раскрыться в
C++ (Qt)
1
2
3
4
5
void tmplt(A a) {
   tmplt<int>(a.a);
   tmplt<float>(a.b);
   tmplt<String>(a.c);
}
Возможно ли вообще такое?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.08.2016, 15:42
Ответы с готовыми решениями:

Создать экземпляр класса без явного указания членов класса
Если у меня есть два конструктора, один из которых по умолчанию, а второй явный. Я почему-то не...

Создать класс CheckerBoard (особенности строения класса - инициализация константных членов класса)
Вот код: #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; const int xSize = 1;...

Массив объектов класса. Печать строк-членов класса.
подскажите, как распечатать строки? #include &quot;myString.h&quot; #include &lt;iostream&gt; #define stop...

Инициализация членов дочернего класса членами класса родителя
Есть уже созданный класс-родитель A. Как эффективно инициализировать дочерний класс B членами...

15
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
18.08.2016, 15:49 2
Не совсем ясно. Объясните подробнее, что вам нужно от функции.
0
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
18.08.2016, 15:49 3
Mirmik,
https://github.com/apolukhin/magic_get
Но я понятия не имею как она работает
1
techpriest
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
18.08.2016, 16:00  [ТС] 4
Я так понимаю, что основа там в :

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
template <class T>
constexpr auto as_tuple_impl(T&& /*val*/, size_t_<0>) noexcept {
  return sequence_tuple::tuple<>{};
}
 
 
template <class T>
constexpr auto as_tuple_impl(T&& val, size_t_<1>) noexcept {
  auto& [a] = std::forward<T>(val);
  return ::boost::pfr::detail::make_tuple_of_references(a);
}
 
template <class T>
constexpr auto as_tuple_impl(T&& val, size_t_<2>) noexcept {
  auto& [a,b] = std::forward<T>(val);
  return ::boost::pfr::detail::make_tuple_of_references(a,b);
}
 
template <class T>
constexpr auto as_tuple_impl(T&& val, size_t_<3>) noexcept {
  auto& [a,b,c] = std::forward<T>(val);
  return ::boost::pfr::detail::make_tuple_of_references(a,b,c);
}
Это видимо С++17...
0
Slip.
18.08.2016, 16:11
  #5

Не по теме:

Цитата Сообщение от Mirmik Посмотреть сообщение
Это видимо С++17...
C++
1
auto auto(auto auto) { auto; }

0
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
18.08.2016, 16:17 6
Цитата Сообщение от Mirmik Посмотреть сообщение
С++17
C++14

Вот, откопал откуда я это брал: https://habrahabr.ru/company/y... nt_9623718

Добавлено через 6 минут
Mirmik, Собственно это единственный красивый вариант, для решения вашей проблемы.
А если вас не устраивает требование в С++NN, тогда макросами генерить поля в структуре.
0
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
18.08.2016, 16:19 7
Цитата Сообщение от Mirmik Посмотреть сообщение
Возможно ли вообще такое?
boost::fusion
0
techpriest
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
18.08.2016, 16:33  [ТС] 8
boost::fusion
Мне б желательно, как оно работает. (И потом, разве оно умеет мою задачу?)

С++NN
С++14 меня вполне устраивает... Я думаю...
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
18.08.2016, 16:42 9
Mirmik, Умеет.
0
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
18.08.2016, 16:48 10
Может кто-нибудь для тех кто в танке объяснить проблему и решение доходчиво?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
18.08.2016, 16:51 11
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <string>
#include <iostream>
#include <boost/fusion/adapted.hpp>
#include <boost/fusion/algorithm.hpp>
 
class A {
public:
   int a;
   float b;
   std::string c;
};
 
BOOST_FUSION_ADAPT_STRUCT(
      A,
      (int, a)
      (float, b)
      (std::string, c)
)
 
template<typename T, typename Fn>
void tmplt(const T& v, Fn fn)
{
   boost::fusion::for_each(v, fn);
}
 
class printer
{
public:
   template<typename T>
   void operator () (const T& v) const
   {
      std::cout << v << std::endl;
   }
};
 
int main() {
  A a;
  a.a = 1;
  a.b = 0.1;
  a.c = "hello";
  tmplt(a, printer());
}
http://melpon.org/wandbox/perm... 7bIqORp1k0
5
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
18.08.2016, 16:52 12
Цитата Сообщение от HighPredator Посмотреть сообщение
объяснить проблему
Рефлексию желают.
1
techpriest
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
18.08.2016, 16:54  [ТС] 13
Ага... Идея понятна.
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
18.08.2016, 22:31 14
Цитата Сообщение от Mirmik Посмотреть сообщение
Возможно ли на С++ вообще написать шаблон, который будет генерировать функцию, производящую одно и тоже действие над каждым членом класса так, как это делается для конструкторов и деструкторов.
нет.
и в ближайшее время на это не придется рассчитывать.
статическую рефлексию завезут не раньше с++20.
0
techpriest
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
19.08.2016, 07:51  [ТС] 15
hoggy ... хорошо бы. Это полезная фишка.
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
20.08.2016, 13:15 16
Цитата Сообщение от Mirmik Посмотреть сообщение
hoggy ... хорошо бы. Это полезная фишка.
сейчас к вашим услугам всевозможные костыли на макросах,
термоядерных шаблонах, и на ручном приводе.

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

есть и более продвинутые решения:
дополнительный этап сборки,
с запуском внешнего кодогенератора.

здесь наиболее приличный дизайн можно подсмотреть,
посмотрев в сторону IDL компиляторов.
1
20.08.2016, 13:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.08.2016, 13:15
Помогаю со студенческими работами здесь

Задачка для новичков #2: вывести в методе класса-родителя значение данных-членов из дочернего класса
Вдохновленный соседней темой тоже решил задать свой вопрос таким же начинающим программистам как и...

Обход инкапсуляции класса
#include &lt;iostream&gt; using namespace std; class My_class { private: char* name; public:...

Обход полей класса
Здравствуйте уважаемые форумчане, подскажите как решить такую ситуацию наиболее верным способом......

Ввод членов класса
почему-то не вводятся члены класса как исправить? #include &lt;string.h&gt; #include &lt;iostream&gt;...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru