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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
relationer
33 / 0 / 0
Регистрация: 07.11.2013
Сообщений: 118
#1

Необходимо хранить список типов, и пользоваться ими, например, вызывать конструкторы - C++

21.08.2014, 15:33. Просмотров 421. Ответов 6
Метки нет (Все метки)

Здравствуйте!

Мне необходимо хранить список типов, и пользоваться ими, например, вызывать конструкторы. Я нашел вариант решения проблемы в известной книге А. Александреску, но книга писалась давно, и вопрос: есть ли какие-либо варианты сделать тоже самое с помощью средств c++11, скажем, вариадических шаблонов (я не могу запихнуть в них то, что мне нужно, но они могут оказаться полезны по-другому)? Произошли ли какие-либо подвижки в этой области?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.08.2014, 15:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Необходимо хранить список типов, и пользоваться ими, например, вызывать конструкторы (C++):

Отладчики - какая от них польза и как ими правильно пользоваться? - C++
Какую пользу несут отладчики и как ими правильно пользоваться? Нет, как его запустить я себе представляю (благо иде помогает), но что я...

Конструкторы ofstream и стандарт C++11 и компилятор gcc необходимо разобраться - C++
Друзья! Условимся, что компилятор g++ поддерживает этот стандарт, ибо ошибок, говорящих об обратном не замечено вроде. //main.cpp ...

Контейнеры, способные хранить данные произвольных (различных) типов - C++
Добрый лень. Существуют ли контейнеры (стандартные, не стандартные - не важно), которые способны хранить данные разных типов, то есть...

Ресурсы проекта. Как ими пользоваться? - C++ Builder
Я создал файл 1.html, записал его в папку проекта, создал файл 1.rc и записал туда имя_ресурса тип_ресурса имя_файла: MYHTML HTMLFILE...

Где хранятся настройки и как ими пользоваться? - C#
В Visual Studio есть такая примочка - встроенные настройки приложения. Пытаюсь разобраться как ее использовать для начала мне очень...

Где лежат библиотеки четвёртой версии OpenOffice и как ими пользоваться? - C#
Вообщем, где лежат библиотеки четвёртой версии OpenOffice, как их подключить и как с ними работать

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
DrOffset
7141 / 4282 / 964
Регистрация: 30.01.2014
Сообщений: 7,084
21.08.2014, 16:08 #2
Цитата Сообщение от relationer Посмотреть сообщение
есть ли какие-либо варианты сделать тоже самое с помощью средств c++11, скажем, вариадических шаблонов (я не могу запихнуть в них то, что мне нужно, но они могут оказаться полезны по-другому)?
Есть. Можно.
Почему ты не можешь в них запихнуть то, что тебе нужно?

Добавлено через 6 минут
Кстати еще можно воспользоваться boost::mpl.
0
relationer
33 / 0 / 0
Регистрация: 07.11.2013
Сообщений: 118
21.08.2014, 16:36  [ТС] #3
Мне необходима длина, перечисление, проч. от этого списка типов.
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
21.08.2014, 17:20 #4
relationer, std::tuple?
1
relationer
33 / 0 / 0
Регистрация: 07.11.2013
Сообщений: 118
21.08.2014, 18:48  [ТС] #5
Он хранит не список типов, а список значений по заданному списку типов. Можно, конечно, использовать decltype, но все это дает ряд ограничений (например, либо используй указатели, либо трать память на хранение единицы объекта, если сможешь её сконструировать).
0
0x10
2464 / 1636 / 238
Регистрация: 24.11.2012
Сообщений: 4,029
21.08.2014, 19:17 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от relationer Посмотреть сообщение
Он хранит не список типов, а список значений по заданному списку типов.
Вас же не заставляют создавать объект тупла:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <string>
#include <tuple>
 
int main() {
  typedef std::tuple<int, std::string> IntString;
  
  std::cout << "Tuple size: "
    << std::tuple_size<IntString>::value << std::endl;
  
  std::tuple_element<1, IntString>::type string_object = "Hello";
  
  std::cout << ">> " << string_object << std::endl;
}
1
DrOffset
7141 / 4282 / 964
Регистрация: 30.01.2014
Сообщений: 7,084
21.08.2014, 20:50 #7
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от relationer Посмотреть сообщение
Мне необходима длина, перечисление, проч. от этого списка типов.
Это все можно обеспечить через variadic templates.
Вообще, в С++11 нет надобности реализовывать список типов как-то отдельно (например через кортежи, как у Александреску, хотя с С++11 и это сделать гораздо проще теперь). Достаточно написать:
C++
1
2
template <typename ...Types>
struct type_list;
Это и будет простейшим списком типов. Теперь к нему можно написать функцию получения по индексу, поиска и длины. Если нужно, могу показать как.

Добавлено через 20 минут
relationer,
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
// Список типов
template <typename ...Types>
struct type_list;
 
// Элемент по индексу
template <typename T, size_t I>
struct type_at;
 
template <typename T, typename... Args, size_t I>
struct type_at<type_list<T, Args...>, I>
{
    typedef typename type_at<type_list<Args...>, I - 1>::type type;
};
template <typename T, typename... Args>
struct type_at<type_list<T, Args...>, 0>
{
    typedef T type;
};
// Длина
template <typename T>
struct type_list_length;
 
template <typename... Args>
struct type_list_length<type_list<Args...>>
{
    enum { value = sizeof...(Args) };
};
 
int main()
{
    typedef type_list<int, char, bool> list3;
 
    std::cout << std::boolalpha
              << "Second element is int:  " << std::is_same<int, type_at<list3, 1>::type>::value  << '\n'
              << "Second element is char: " << std::is_same<char, type_at<list3, 1>::type>::value << '\n';
 
    std::cout << "List length: " << type_list_length<list3>::value << std::endl;
}
2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.08.2014, 20:50
Привет! Вот еще темы с ответами:

Возможно ли на C# вызывать функции из C, например fopen - C#
Здравствуйте Вопрос, возможно, глупый, но все равно: возможно ли на C# вызывать функции из C, например fopen(...);, и как это делается. ...

Как лучше хранить данные приложения, например, настройки - C#
Здравствуйте. Прошу вашего совета: Разрабатываю приложение на c# (Windows Forms). Суть его(упрощенно) такова - есть определенные...

Как заставить колекцию хранить несколько типов ? - C#
Здраствуйте, есть учебное задание (даю оригинал на английском): Написал такой код, который реализует классы Cat и Dog: abstract...

Как пользоваться утилитой javap в IDE, например, IntelliJ IDEA или провести рефлексию класса? - Java SE
Как пользоваться утилитой javap в IDE, например IntelliJ IDEA или провести рефлексию класса?


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
21.08.2014, 20:50
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru