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

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

Восстановить пароль Регистрация
 
relationer
33 / 0 / 0
Регистрация: 07.11.2013
Сообщений: 118
21.08.2014, 15:33     Необходимо хранить список типов, и пользоваться ими, например, вызывать конструкторы #1
Здравствуйте!

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

Реализовать список, поля которого могут хранить разные типы данных C++
C++ Добавить в список указатели на обьекты произвольных типов
Необходимо, чтобы в каждой строчке файла программа копировала в какую нибудь переменную часть структуры, чей личный код например равен 6 C++
C++ Необходимо создать список, элемент которого может быть список
Необходимо ввести строку символов, например два или три слова C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6416 / 3790 / 876
Регистрация: 30.01.2014
Сообщений: 6,575
21.08.2014, 16:08     Необходимо хранить список типов, и пользоваться ими, например, вызывать конструкторы #2
Цитата Сообщение от relationer Посмотреть сообщение
есть ли какие-либо варианты сделать тоже самое с помощью средств c++11, скажем, вариадических шаблонов (я не могу запихнуть в них то, что мне нужно, но они могут оказаться полезны по-другому)?
Есть. Можно.
Почему ты не можешь в них запихнуть то, что тебе нужно?

Добавлено через 6 минут
Кстати еще можно воспользоваться boost::mpl.
relationer
33 / 0 / 0
Регистрация: 07.11.2013
Сообщений: 118
21.08.2014, 16:36  [ТС]     Необходимо хранить список типов, и пользоваться ими, например, вызывать конструкторы #3
Мне необходима длина, перечисление, проч. от этого списка типов.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
21.08.2014, 17:20     Необходимо хранить список типов, и пользоваться ими, например, вызывать конструкторы #4
relationer, std::tuple?
relationer
33 / 0 / 0
Регистрация: 07.11.2013
Сообщений: 118
21.08.2014, 18:48  [ТС]     Необходимо хранить список типов, и пользоваться ими, например, вызывать конструкторы #5
Он хранит не список типов, а список значений по заданному списку типов. Можно, конечно, использовать decltype, но все это дает ряд ограничений (например, либо используй указатели, либо трать память на хранение единицы объекта, если сможешь её сконструировать).
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.08.2014, 20:50     Необходимо хранить список типов, и пользоваться ими, например, вызывать конструкторы
Еще ссылки по теме:

C++ Отладчики - какая от них польза и как ими правильно пользоваться?
Конструкторы ofstream и стандарт C++11 и компилятор gcc необходимо разобраться C++
C++ Контейнеры, способные хранить данные произвольных (различных) типов

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

Или воспользуйтесь поиском по форуму:
DrOffset
6416 / 3790 / 876
Регистрация: 30.01.2014
Сообщений: 6,575
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;
}
Yandex
Объявления
21.08.2014, 20:50     Необходимо хранить список типов, и пользоваться ими, например, вызывать конструкторы
Ответ Создать тему
Опции темы

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