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

Обертка над boost::lexical_cast для работы с unsigned типами - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Hex to Ascii http://www.cyberforum.ru/cpp/thread1650678.html
Всем привет! Работаю с АЦП, и ему надо отправить ascii код (55H 55H 00H 00H AAH). (в виде char будет (UU ª), просто так отправить не удалось) Попробовал отправить hex (55 55 00 00 AA), не принимает. Кто-нибудь может мне помочь вывести строчку "UU ª" хотя бы на командную строку?
C++ QtCipherSqlitePlugin sqlite3_rekey не шифрует Пытаюсь сменить пароль на БД. 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) http://www.cyberforum.ru/cpp/thread1649506.html
C++ Инструмент для быстрого создания установщиков программ
Есть ли какой-нибудь инструмент для быстрого создания установщиков программ, как например InnoSetup, но для C++? Или хотя бы приближенный к этому.
Как скомпилировать Lammps под windows? C++
Добрый день! Очень нужна помощь в установке и запуске программы молекулярной динамики LAMMPS под Windows. Программу установил, создал bat. файл запуска,но программа все равно не работает. Я новичок в программировании, есть ли простой способ установки и запуска данной программы.
C++ Как правильно создать ModBus ASCII запрос? http://www.cyberforum.ru/cpp/thread1647759.html
Адрес - 26 Код функции 03h начало - 0000 Количество -0004 расчет LRC char calculateLRC( char b, int n){ char lrc = 0x00; for (int i = 1; i < n; i++) {
C++ Почему происходит ошибка undefined reference to hgeCreate Всем привет. Я новичок по C++ и недавно решил освоить разработку игр. Скачал с интернета 2D движок для графики HGE, однако никак не могу скомпилировать даже пример, ибо компилятор ругается. Код примера: #include "include/hge.h" HGE *hge = 0; bool FrameFunc() { if (hge->Input_GetKeyState(HGEK_ESCAPE)) return true; return false; подробнее

Показать сообщение отдельно
Croessmah
Модератор
Эксперт CЭксперт С++
12695 / 7169 / 800
Регистрация: 27.09.2012
Сообщений: 17,674
Записей в блоге: 2
Завершенные тесты: 1
01.02.2016, 03:33  [ТС]     Обертка над boost::lexical_cast для работы с unsigned типами
С учетом дополнений из темы Применение is_same для списка типов

Немного доработал код.
Добавил два макроса:
C++
1
2
3
4
5
6
//temporary macros
#define TYPE_LIST_CV(type) type, const type, volatile type, volatile const type
 
#define IGNORING_TYPES              \
    TYPE_LIST_CV(char*),            \
    TYPE_LIST_CV(std::vector<char>)
TYPE_LIST_CV - добавляет к типу квалификаторы
IGNORING_TYPES - список типов, которые должны игнорироваться основным шаблоном

Немного переработал основной шаблон string_cast, для учета указанных игнорируемых типов:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
template<typename TargetType, typename StringType>
std::enable_if_t<
    !is_one_same<
        std::decay_t<StringType>,
        IGNORING_TYPES
    >::value,
    std::decay_t<TargetType>
>
string_cast(StringType&& source)
{
    using CharT = std::decay_t<decltype(source[0])> ;
 
    using DecayType = typename std::decay<TargetType>::type ;
 
    std::basic_string<CharT> str(std::forward<StringType>(source)) ;
 
    boost::trim(str) ;
    return detail::string_cast_impl::cast<DecayType>(str) ;
 
}
Теперь, чтобы добавить "особую" версию string_cast для какого-либо типа,
необходимо добавить тип в список игнорируемых
(если требуется игнорировать типы со всеми квалификаторами,
то можно использовать TYPE_LIST_CV), и также
добавить string_cast с этой "особой" реализацией,
добавив в is_one_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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
/*
 * main.cpp
 *
 *  Created on: 29 янв. 2016 г.
 *      author: Croessmah
 */
 
#include <iostream>
#include <vector>
 
 
 
#include <type_traits>
 
 
#include <boost/lexical_cast.hpp>
#include <boost/algorithm/string.hpp>
 
 
// =========================================================================================================
// ================================================is_same_list=============================================
// =========================================================================================================
 
 
#include <type_traits>
 
namespace detail
{
 
    template<
        template<class T> class LogicTemplate,
        typename SameType
    >
 
    constexpr bool
    is_same_list_impl()
    {
        return !LogicTemplate<bool>()(true,false) ;
    }
 
 
    template<
    template<class T> class LogicTemplate,
        typename SameType,
        typename FirstType,
        typename ... Args
    >
    constexpr bool
    is_same_list_impl()
    {
        return
                LogicTemplate<bool>()(std::is_same<SameType, FirstType>::value,
                    is_same_list_impl<LogicTemplate, SameType, Args...>()
                ) ;
    }
 
 
 
}//end of detail
 
 
 
 
namespace compile_time
{
    template<class T>
    struct logical_and : public std::binary_function<T,T,bool>
    {
        constexpr bool operator()(const T& first, const T& second) { return first && second ; }
    };
 
 
    template<class T>
    struct logical_or : public std::binary_function<T,T,bool>
    {
        constexpr bool operator()(const T& first, const T& second) { return first || second ; }
    };
}//end of compile_time
 
 
 
 
template<typename SameType, typename ... Args>
struct is_all_same
{
    static constexpr bool value =
            detail::is_same_list_impl<
                compile_time::logical_and,
                SameType, Args...
            >() ;
};
 
 
template<typename SameType, typename ... Args>
struct is_one_same
{
    static constexpr bool value =
            detail::is_same_list_impl<
                compile_time::logical_or,
                SameType, Args...
            >() ;
};
 
 
 
 
 
// =========================================================================================================
// =========================================================================================================
// =========================================================================================================
 
 
// =========================================================================================================
// ================================================string_cast==============================================
// =========================================================================================================
 
 
#include <boost/lexical_cast.hpp>
#include <boost/algorithm/string.hpp>
 
 
namespace detail
{
    struct string_cast_impl
    {
        template<typename TargetType, typename StringType> static
        typename std::enable_if<std::is_unsigned<TargetType>::value, TargetType>::type
        cast(const StringType& source)
        {
            if (!source.empty() && source[0] == '-'){
                TargetType result = boost::lexical_cast<TargetType>(source) ;
                return (result!=0) ? throw boost::bad_lexical_cast(),TargetType(0) : result  ;
            }
            return boost::lexical_cast<TargetType>(source);
        }
 
 
        template<typename TargetType, typename StringType> static
        typename std::enable_if<!std::is_unsigned<TargetType>::value, TargetType>::type
        cast(const StringType& source)
        {
            return boost::lexical_cast<TargetType>(source) ;
        }
    };
 
 
}//end of detail
 
 
 
 
//temporary macros
#define TYPE_LIST_CV(type) type, const type, volatile type, volatile const type
 
#define IGNORING_TYPES              \
    TYPE_LIST_CV(char*),            \
    TYPE_LIST_CV(std::vector<char>)
 
 
//Включаем шаблон для всех типов, кроме IGNORING_TYPES
template<typename TargetType, typename StringType>
std::enable_if_t<
    !is_one_same<
        std::decay_t<StringType>,
        IGNORING_TYPES
    >::value,
    std::decay_t<TargetType>
>
string_cast(StringType&& source)
{
    using CharT = std::decay_t<decltype(source[0])> ;
 
    using DecayType = typename std::decay<TargetType>::type ;
 
    std::basic_string<CharT> str(std::forward<StringType>(source)) ;
 
    boost::trim(str) ;
    return detail::string_cast_impl::cast<DecayType>(str) ;
 
}
 
 
 
 
//Включаем шаблон для типов TYPE_LIST_CV(char*)
template<typename TargetType, typename StringType>
std::enable_if_t<
    is_one_same<
        std::decay_t<StringType>,
        TYPE_LIST_CV(char*)
    >::value,
    std::decay_t<TargetType>
>
string_cast(StringType&& source)
{
    using DecayType = typename std::decay<TargetType>::type ;
    std::string str(std::forward<StringType>(source)) ;
    boost::trim(str) ;
    return detail::string_cast_impl::cast<DecayType>(str) ;
}
 
 
 
//Включаем шаблон для типов TYPE_LIST_CV(std::vector<char>)
template<typename TargetType, typename StringType>
std::enable_if_t<
    is_one_same<
        std::decay_t<StringType>,
        TYPE_LIST_CV(std::vector<char>)
    >::value,
    std::decay_t<TargetType>
>
string_cast(StringType&& source)
{
    using DecayType = typename std::decay<TargetType>::type ;
    std::string str(source.begin(), source.end()) ;
    boost::trim(str) ;
    return detail::string_cast_impl::cast<DecayType>(str) ;
}
 
 
 
 
#undef IGNORING_TYPES
#undef TYPE_LIST_CV
 
// =========================================================================================================
// =========================================================================================================
// =========================================================================================================
 
 
 
 
int main(int argc, char ** argv)
{
    std::string str1 ("10") ;
    const char * str2 = "-0" ;
    std::vector<char> vec {'+', '4','0'} ;
    std::cout << string_cast<int>(str1) << std::endl ;
    std::cout << string_cast<unsigned int>(str2) << std::endl ;
    std::cout << string_cast<int>(vec) << std::endl ;
}
http://rextester.com/TZQPR61455

причем, типов, включающих одну такую "специализацию" может быть несколько, например,
C++
1
2
3
4
5
6
7
8
std::enable_if_t<
    is_one_same<
        std::decay_t<StringType>,
        TYPE_LIST_CV(Glib::ustring),
        TYPE_LIST_CV(char*)
    >::value,
    std::decay_t<TargetType>
>
"включит" шаблон для типов TYPE_LIST_CV(Glib::ustring) и TYPE_LIST_CV(char*)
 
Текущее время: 23:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru