- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
template <size_t capacity, bool is_signed>
class fixed_int
{
// Описание ошибки компиляции в случае использования не поддерживаемой размерности
template <int x> struct unsupported_capacity { int i[1/(x-x)]; };
template <> struct unsupported_capacity<1> {};
template <> struct unsupported_capacity<2> {};
template <> struct unsupported_capacity<4> {};
template <> struct unsupported_capacity<8> {};
// Свойства базовых типов, необходимые для перебора
template<typename type> struct type_traits;
template<> struct type_traits <unsigned char> { typedef unsigned char current_type; typedef unsigned short next_type; };
template<> struct type_traits <unsigned short> { typedef unsigned short current_type; typedef unsigned int next_type; };
template<> struct type_traits <unsigned int> { typedef unsigned int current_type; typedef unsigned long next_type; };
template<> struct type_traits <unsigned long> { typedef unsigned long current_type; typedef unsigned long long next_type; };
template<> struct type_traits <unsigned long long int> { typedef unsigned long long int current_type; typedef unsupported_capacity<capacity> next_type; };
template<> struct type_traits <signed char> { typedef signed char current_type; typedef short next_type; };
template<> struct type_traits <short> { typedef short current_type; typedef int next_type; };
template<> struct type_traits <int> { typedef int current_type; typedef long next_type; };
template<> struct type_traits <long> { typedef long current_type; typedef long long next_type; };
template<> struct type_traits <long long int> { typedef long long int current_type; typedef unsupported_capacity<capacity> next_type;};
// Алгоритм выбора типа
template<typename type, bool>
struct type_choice
{
typedef typename type_traits<type>::current_type std_type;
};
template<typename type>
struct type_choice<type, false>
{
typedef typename type_traits<type>::next_type next_type;
typedef typename type_choice<next_type, sizeof(next_type) == capacity>::std_type std_type;
};
// Базовый тип для начала подбора
template <bool is_signed> struct base_type_selector { typedef signed char base_type; };
template <> struct base_type_selector<false> { typedef unsigned char base_type; };
public:
typedef typename type_choice< typename base_type_selector<is_signed>::base_type, sizeof(base_type_selector<is_signed>::base_type) == capacity >::std_type type;
};
Antervis 31.03.2016 07:40 # +1
gost 31.03.2016 08:36 # 0
guest 01.04.2016 01:34 # 0
Xom94ok 31.03.2016 09:45 # +1
kegdan 31.03.2016 10:08 # 0
Antervis 31.03.2016 10:12 # 0
Bobik 31.03.2016 12:55 # 0
defecate-plusplus 31.03.2016 10:03 # 0
Xom94ok 31.03.2016 22:03 # 0
roman-kashitsyn 31.03.2016 22:07 # 0
Мне вот интересней, почему никто не предложил boost/cstdint.h? Пришлось самому.
defecate-plusplus 31.03.2016 22:40 # 0
roman-kashitsyn 31.03.2016 22:42 # 0
Soul_re@ver 31.03.2016 11:00 # 0
codemonkey 31.03.2016 12:52 # 0
Antervis 01.04.2016 07:20 # 0
tucvbif 01.04.2016 09:43 # +1
3.14159265 01.04.2016 11:25 # 0
>А какая реализация, мальчик или девочка?
Dummy00001 01.04.2016 01:02 # +2
винды как винды. поэтому и "кроссплатформенно*; (*)поддерживаем только винды."
тема на самом деле нетривиальная. еще помню как сам в подсознании недели медитировал над бсд-шным "file descriptor is int". потому что после годов braindamage от WinAPI нечто настолько простое и примитивное мозги не принимали.
Antervis 01.04.2016 07:18 # 0
Dummy00001 01.04.2016 07:32 # +1
https://msdn.microsoft.com/en-us/library/windows/desktop/aa363858%28v=vs.85%29.aspx
https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751%28v=vs.85%29.aspx
Steve_Brown 01.04.2016 11:34 # 0
А разве это плохо?
Dummy00001 01.04.2016 16:24 # 0
плохо то что винды используют кучи typedef'ов для каждой всевозможной мелочи, и большинство этих тайпдефов начинаются с `H` как бы намекая что они тоже handle. грабли в том что не все из этих хандлов есть HANDLE'ы. и это настоящие грабли на которые народ часто наступает. для "решения" этой "проблемы" в windows.h есть "STRICT" дефайн который из `void *` делает `unique_dummy_struct *` что бы все хандлы были разных типов, но это помогает слабо потому что код плавно и неизбежно обрастает конверсиями хандлов, и мы опять там где начали.
ЗЫ пример: HFILE.
defecate-plusplus 01.04.2016 17:49 # 0
guest 01.04.2016 17:52 # +3
defecate-plusplus 01.04.2016 17:56 # 0
можно как в пост, взять хендл мяса и вслух объявить его спаржей, после чего жрать как спаржу
только вот бы пример более реальный
guest 01.04.2016 18:05 # +1
приводить друг к другу типы, которые официально не приводятся это говнокод
https://en.wikipedia.org/wiki/Opaque_data_type
Dummy00001 01.04.2016 18:27 # +1
я еще не разу не видел куска кода 100% портабельного кода для виндов.
в прошлом тупо все примеры изо всех версий msdev'а (когда он еще msdev'ом назывался) - сканировал на предмет как правильно писать. и бля те же примеры часто уже на другой версии msdev'а не собирались, не говоря уже о том что бы работали на другой версии виндов без проблемно.
не говоря о выньапи - даже шарп не исключение.
Dummy00001 01.04.2016 18:24 # +2
класические примеры говно-источников этого маразма это WaitSingleObject()/этц и SelectObject().
если ты пытаешься в своем коде хотя бы какой-то порядок навести, что бы отличать десятки разных типов хэндлов (потому что бля указывают на разные типы объектов) то желательно пользоватся правильными типами. как ни крути - грабли.
inkanus-gray 01.04.2016 19:31 # 0
Некоторые функции WinAPI принимают в качестве одного аргумента дескриптор из некоторого множества типов, например, {HFILE, HWND, HSOMETHING}, а в сраной сишке нет возможности это описать вменяемым способом. Из ситуации есть несколько выходов:
1. «Перегрузка» функций. Т. е. плодить функции WaitSingleObjectHFILE, WaitSingleObjectHWND, WaitSingleObjectHSOMETHING etc.
2. Оборачивать дескриптор в union. Например, создать тип HSOMESETOFTYPES, являющийся union'ом из HFILE, HWND, HSOMETHING.
3. Конвертировать типы в какой-нибудь базовый вроде HANDLE.
Я правильно понял?
guest 01.04.2016 19:40 # +4
кастить вверхз и вниз можно, а кастить вбок нельзя.
inkanus-gray 01.04.2016 19:55 # +2
Ещё и немец...
Dummy00001 01.04.2016 19:48 # 0
Да.
inkanus-gray 01.04.2016 17:56 # 0
guest 01.04.2016 18:04 # 0
люди, вы чего??
хендл это OPAQUE TYPE! Вам вообще никто не гарантирует что там внутри
inkanus-gray 01.04.2016 18:21 # 0
Dummy00001 01.04.2016 18:36 # 0
bormand 01.04.2016 20:28 # +2
А что у них внутри - всем насрать.
guest 01.04.2016 20:30 # 0