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

Выбор типа переменной-члена класса в зависимости от параметров передаваемых конструктору - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Как связать работу двух исполняемых файлов? http://www.cyberforum.ru/cpp-beginners/thread830493.html
Мне нужно, что бы главный файл запускал второй файл 4 раза.... но я даже 1 раз не могу запустить. Вот такой код: Файл L2F_1: #include <windows.h> #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <time.h> DWORD dwThrId1;
C++ Программирование графики Я студент-программист С++. У меня есть небольшой опыт разработки в средах win API, BUILDER. Сейчас хочу понять как работает графический интерфейс. И вряд ли нужно говорить, что тупое чтение литературы, без практики, оставит в моем мозгу хоть что то нужное. Поэтому я решил сделать это, создавая игру. Хочу создать игру на подобие старой доброй игры-где ты летишь в космосе на самолетике и... http://www.cyberforum.ru/cpp-beginners/thread830489.html
Сортировка по дате рождения данных в классе C++
В классе хочу отсортировать людей по дням, месяцам и годам рождения сразу, но получается только что-то одно. Т.е. вот данные: Oleg Scorpion 07 11 1994 Pety Telez 13 10 1995 Katy Lev 27 05 1994 Nikita Deva 23 09 1994 Dasha Deva 08 06 1995 Sasha Oven 22 09 1993 Max Strelec 19 12 1993
C++ Кодирование
В какой тип данных можно записывать по одному биту 0 или 1, чтобы потом можно было считать целиком последовательность. Например, 010 или 1.
C++ координаты http://www.cyberforum.ru/cpp-beginners/thread830466.html
Подскажите, пожалуйста, как реализовать: 1) поиск точек отрезков прямых линий на плоскости XY, которые имеют обе целочисленные координаты. 2) компонентный метод перечисления всех целочисленных точек отрезка в порядке уменьшения координаты Y. Координаты концов отрезка задаются через стандартный поток ввода (не через аргументы ком. строки!) Не понимаю алгоритма нахождения и вывода(
C++ Как нарисовать круг Нужно нарисовать круг подробнее

Показать сообщение отдельно
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
08.04.2013, 10:49     Выбор типа переменной-члена класса в зависимости от параметров передаваемых конструктору
Michael_Ivanyuk, Все возможно. Но надо-ли это? Рефлексии в С++ нет. Определить тип на этапе выполнения можно только с помощью typeid. variant и any могут помочь, а могут и нет. void* самый грязный, но в то же время относительно простой вариант. Можно еще с объединениями поиграться ( собственно variant и есть объединение по своей сути, только несколько улучшенное ).

Добавлено через 33 минуты
Вцелом через boost::any нечто вроде такого (наверняка можно сделать лучше).

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include <iostream>
#include <map>
#include <typeinfo>
#include <stdexcept>
 
#include <boost/any.hpp>
 
class Data
{
public:
 
   enum type_t { int_, double_, string_ };
 
   Data(const std::string& t)
   {
      initialize(t);
   }
 
   template<typename T>
   void set(const T& v)
   {
      if (typeid(v) != *std_type)
      {
         throw std::logic_error("wrong_type");
      }
      value = v;
   }
 
   std::ostream& print(std::ostream& os) const
   {
      switch (type)
      {
      case int_:
         os << boost::any_cast<int>(value);
         break;
      case double_:
         os << boost::any_cast<double>(value);
         break;
      case string_:
         os << boost::any_cast<std::string>(value);
         break;
      default:
         break;
      }
      return os;
   }
private:
   void initialize(const std::string& v)
   {
      auto pos = types.find(v);
      if (pos == types.end())
      {
         throw std::logic_error("invalid_type");
      }
      type = pos->second.first;
      std_type = pos->second.second;
   }
 
   static const std::map<std::string, std::pair<type_t, std::type_info*>> types;
 
   boost::any value;
   type_t type;
   std::type_info* std_type;
};
 
const std::map<std::string, std::pair<Data::type_t, std::type_info*>> Data::types =
{
   {"int", std::make_pair(int_, const_cast<std::type_info*>(&typeid(int)))},
   {"double", std::make_pair(double_, const_cast<std::type_info*>(&typeid(double)))},
   {"string", std::make_pair(string_, const_cast<std::type_info*>(&typeid(std::string)))}
};
 
std::ostream& operator << (std::ostream& os, const Data& v)
{
   return v.print(os);
}
 
int main()
{
   std::string type = "int";
   Data d(type);
   d.set(1);
   std::cout << d << std::endl;
   try
   {
      Data dd("string");
      dd.set(1.0);
      std::cout << dd << std::endl;
   }
   catch (const std::exception& e)
   {
      //
   }
   Data t("string");
   t.set(std::string("hello"));
   std::cout << t << std::endl;
}
Но все-таки при большом кол-ве типов лучше выбрать полиморфизм.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru