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

Кортежи, метафункции и все, все, все. - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ 2 камеры в OpenCV http://www.cyberforum.ru/cpp/thread390098.html
Здравствуйте. У меня возникла вот такая проблема. Я работаю с изображениями с камеры в OpenSUSE, используя OpenCV. Когда я читаю изображение с камеры самым простейшим кодом: #include...
C++ Шифрование PKI нужна программа, написанная на любом виде языке программирования, которая осуществляла метод шифрования PKI. Если есть такая программка, пожалуйста, расскажите в кратце код...Заранее пасЫбо=) http://www.cyberforum.ru/cpp/thread388999.html
MPI и Borland C++ 5.0 C++
Может, кто-нибудь знает, как настроить Borland C++ 5.02 на работу с библиотекой mpi? файлы в include, lib переместила, но как присоединить эту библиотеку к проекту - ума не приложу. Помогите,...
Ошибка компилятора C++
Всем привет) У меня такая вот проблема с компилятором Сначала всё шло хорошо. Потом стала выкидывать ошибку. Пробовал и винду менять, и версии, и совместимости ставил. Ничего не помогало. Прошу...
C++ Не удается запустить С++ приложение в среде NetBeans 7.0.1 (MinGW) http://www.cyberforum.ru/cpp/thread386395.html
Здравствуйте, Не получается запустить приложение в среде NetBeans версии 7.0.1. Настроил по идее все как полагается: Установил MinGW, компилятор для C++ и msys(1.0), добавил в переменные среды PATH...
C++ Движок 3D Подскажите пожалуйста где можно написать игры так сказать с визуальным редактором Пробовал на C++ Bulder XE2 но он не умеет нормально вставлять 3d обьекты и работать с ними не возможно. подробнее

Показать сообщение отдельно
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501

Кортежи, метафункции и все, все, все. - C++

03.12.2011, 00:26. Просмотров 1382. Ответов 8
Метки (Все метки)

Цель — модифицировать заданный кортеж (например, "std::tuple") путём добавления в него новых типов или удаления существующих.

Сперва попробовал создать кортеж при помощи "boost::mpl::vector" и "boost::mpl::inherit", но проблема в том, что результат эмпээлевских метафункций неопределён, и, например, "pop_back<vector>::type" не является вектором. А мне нужно получить честный кортеж (пусть даже и сложного типа), т.к. далее нужно получить доступ к его элементам.

Решил написать свои метафункции. Вставка в начало и в конец и удаление из начала — тривиальны и компилируются за константное время — всё отлично. Но вот удаление с конца, к сожалению, так хорошо реализовать не удалось. А именно: удалось получить только линейное время.

Текст программы
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
#include <iostream>
 
template <typename ... Types>
struct test;
 
namespace mpl
{
    // ---- Удаление с конца ----------------------------------------------------------------------
    
    template <template <typename ...> class Class, typename HeadList, typename TailList>
    struct do_pop_back;
 
    template <template <typename ...> class Class, typename ... Head, typename Middle, typename ... Tail>
    struct do_pop_back<Class, void (Head ...), void (Middle, Tail ...)>
    {
        typedef typename do_pop_back<Class, void (Head ..., Middle), void (Tail ...)>::type type;
    };
 
    template <template <typename ...> class Class, typename ... Head, typename Tail>
    struct do_pop_back<Class, void (Head ...), void (Tail)>
    {
        typedef Class<Head ...> type;
    };
    
    template <template <typename ...> class Class, typename Only>
    struct do_pop_back<Class, void (Only), void ()>
    {
        typedef Class<> type;
    };
 
    template <typename Tuple>
    struct pop_back;
 
    template <template <typename ...> class Class, typename Head, typename ... Tail>
    struct pop_back<Class<Head, Tail ...>>
    {
        typedef typename do_pop_back<Class, void (Head), void (Tail ...)>::type type;
    };
    
    // ---- Вставка в конец -----------------------------------------------------------------------
    
    template <typename Tuple, typename Type>
    struct push_back;
    
    template <template <typename ...> class Class, typename ... Head, typename Tail>
    struct push_back<Class<Head ...>, Tail>
    {
        typedef Class<Head..., Tail> type;
    };
    
    // ---- Удаление с начала ---------------------------------------------------------------------
    
    template <typename Tuple>
    struct pop_front;
    
    template <template <typename ...> class Class, typename Head, typename ... Tail>
    struct pop_front<Class<Head, Tail ...>>
    {
        typedef Class<Tail ...> type;
    };
    
    // ---- Вставка в начало ----------------------------------------------------------------------
    
    template <typename Tuple, typename Type>
    struct push_front;
    
    template <template <typename ...> class Class, typename ... Tail, typename Head>
    struct push_front<Class<Tail ...>, Head>
    {
        typedef Class<Head, Tail ...> type;
    };
} // namespace mpl
 
int main()
{
    typedef std::tuple<int, double> tuple0;
    
    typedef mpl::pop_back<tuple0>::type tuple1;
    test<tuple1>(); // Эта штука, как вы догадались, порождает ошибку компиляции, которая печатает
                    // имя типа в явном виде.
    
    typedef mpl::push_back<tuple1, std::string>::type tuple2;
    test<tuple2>();
    
    typedef mpl::pop_front<tuple2>::type tuple3;
    test<tuple3>();
    
    typedef mpl::push_front<tuple3, bool>::type tuple4;
    test<tuple4>();
        
    return 0;
}


Итак, вопрос первый.
Может, я плохо искал? Можно ли с помощью "Буста" добиться желаемого результата?

Вопрос второй.
Есть ли идеи, как можно модифицировать метафункцию "pop_back" так, чтобы она компилировалась за константное время?

Вопрос третий.
Обратите внимание на "do_pop_back". Как думаете, православно ли подобное оперирование со списками типов (я имею в виду оборачивание в "void (...)")? По крайней мере, это лучший из пришедших в голову вариантов.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru