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

Применение is_same для списка типов - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Виснет графика в SDL http://www.cyberforum.ru/cpp/thread1652358.html
Здравствуйте, пишу программу, которая меняет две картинки под музыку, после нескольких секунд музыка продолжает играть, но картинки не меняются и программа получает статус "не отвечает". Почему? Буду благодарен за помощь. #include <SDL.h> #include <SDL_mixer.h> #include <stdio.h> #include <string> #include <iostream> using namespace std; int main( int argc, char* args ){
C++ [mingw] не видит <codecvt> всем привет. есть библиотека, которая изначально разрабатывалась в msvc2013. к библиотеке есть требование - кросс-платформа, и отсутствие внешних зависимостей. то есть, нельзя подтягивать буст, и подобные тяжеловесные вещи. казалось бы - никаких левых зависимостей, http://www.cyberforum.ru/cpp/thread1652249.html
C++ Обертка над boost::lexical_cast для работы с unsigned типами
Пару дней назад выяснилось, что boost::lexical_cast не удовлетворяет нескольким требованиям в моей программе. boost::lexical_cast отказывается обрабатывать и выбрасывает исключение, если имеются пробелы в начале или в конце входной строки. Также для unsigned типов, отрицательные значения обрабатываются нормально, т.е., например, boost::lexical_cast<unsigned int>("-1") даст вполне валидное...
C++ Hex to Ascii
Всем привет! Работаю с АЦП, и ему надо отправить ascii код (55H 55H 00H 00H AAH). (в виде char будет (UU ª), просто так отправить не удалось) Попробовал отправить hex (55 55 00 00 AA), не принимает. Кто-нибудь может мне помочь вывести строчку "UU ª" хотя бы на командную строку?
C++ QtCipherSqlitePlugin sqlite3_rekey не шифрует http://www.cyberforum.ru/cpp/thread1649506.html
Пытаюсь сменить пароль на БД. QSqlDriver *driver=myDatabase.driver(); QVariant handle=driver->handle(); Q_ASSERT_X(handle.isValid(), Q_FUNC_INFO, "Invalid handle of QSqlDriver"); if(handle.isValid() && qstrcmp(handle.typeName(), "sqlite3*")!=0) return false; sqlite3* db=*static_cast<sqlite3* const*>(handle.data()); if(db==NULL)
C++ Инструмент для быстрого создания установщиков программ Есть ли какой-нибудь инструмент для быстрого создания установщиков программ, как например InnoSetup, но для C++? Или хотя бы приближенный к этому. подробнее

Показать сообщение отдельно
Croessmah
Модератор
Эксперт CЭксперт С++
12980 / 7292 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1

Применение is_same для списка типов - C++

01.02.2016, 03:16. Просмотров 658. Ответов 17
Метки (Все метки)

Итак, std::is_same может сравнить только два типа.
Написал велосипед,
который сравнивает первый тип со всеми остальными.
Собственно, вот код:
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include <type_traits>
 
 
// =========================================================================================================
// ================================================is_same_list=============================================
// =========================================================================================================
 
 
namespace detail
{
 
 
 
struct is_same_list_impl
{
    template<
        template<bool,bool> class LogicTemplate,
        typename SameType,
        typename FirstType,
        typename ... Args
    >
    static
    constexpr std::enable_if_t<sizeof...(Args)!=0,bool>
    constexpr_call()
    {
        return
                LogicTemplate<
                    std::is_same<
                        SameType,
                        FirstType
                    >::value,
                    constexpr_call<LogicTemplate, SameType, Args...>()
                >::value ;
    }
 
 
 
    template<
        template<bool,bool> class LogicTemplate,
        typename SameType,
        typename FirstType,
        typename ... Args
    >
    static
    constexpr std::enable_if_t<sizeof...(Args)==0,bool>
    constexpr_call()
    {
        return
                std::is_same<
                    SameType,
                    FirstType
                >::value ;
    }
};
 
 
 
 
 
}//end of detail
 
 
 
 
namespace compile_time
{
    template<bool First, bool Second>
    struct constexpr_logical_and
    {
        static constexpr bool value = First && Second ;
    };
 
 
    template<bool First, bool Second>
    struct constexpr_logical_or
    {
        static constexpr bool value = First || Second ;
    };
}//end of compile_time
 
 
 
template<typename First, typename Second>
struct is_same_decay
{
    static constexpr bool value =
            std::is_same<
                std::decay_t<First>,
                std::decay_t<Second>
            >::value ;
};
 
 
template<typename SameType, typename ... Args>
struct is_all_same
{
    static constexpr bool value =
            detail::is_same_list_impl::constexpr_call<
                compile_time::constexpr_logical_and,
                SameType, Args...
            >() ;
};
 
 
template<typename SameType, typename ... Args>
struct is_one_same
{
    static constexpr bool value =
            detail::is_same_list_impl::constexpr_call<
                compile_time::constexpr_logical_or,
                SameType, Args...
            >() ;
};
 
 
 
 
 
// =========================================================================================================
// =========================================================================================================
// =========================================================================================================
is_one_same - определяет, есть ли в списке параметров хоть один тип, одинаковый с первым в списке,
т.е. false, если все типы отличны от первого, true - во всех остальных случаях.
is_all_same - определяет, все ли типы в списке одинаковые,
т.е. true, если все типы соответствуют первому, false - во всех остальных случаях.



Пример использования:
C++
1
2
3
4
5
6
7
8
9
10
int main(int argc, char ** argv)
{
    std::cout << is_all_same<int,int,float,double,int&>::value << std::endl ; //false
    std::cout << is_all_same<int,int,int,int,int&>::value << std::endl ;//false 
    std::cout << is_all_same<int,int,int,int,int>::value << std::endl ;//true
    std::cout << std::endl ;
    std::cout << is_one_same<int,int,float,double,int&>::value << std::endl ;//true
    std::cout << is_one_same<int,std::ostream,float,double,unsigned int>::value << std::endl ;//false
    std::cout << is_one_same<int,int,int,int,int>::value << std::endl ;//true
}
http://rextester.com/CZFY1496

Для чего это мне может пригодится, опишу в теме Обертка над boost::lexical_cast для работы с unsigned типами
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru