2017-02-19 21 views
0

Мне нужно иметь возможность различать типы данных с одинаковыми размерами, но с разными свойствами подписывания. Пример следующим образом,Дифференциация специализированных структур на основе подписей

template <size_t N> 
struct alias; 

template<> 
struct alias<sizeof(unsigned char)>{ 
    using Type = unsigned char; 
}; 

template<> 
struct alias<sizeof(signed char)>{ 
    using Type = signed char; 
}; 

using uint8 = alias<1>::Type; 
using int8 = alias<1>::Type; //This is supposed to be signed type 

После первой специализации использует символ без знака и оба знака и без знака символы используют один и тот же размер, alias<1>::Type результатов возвращаются символ без знака. Но я хочу иметь возможность возвращать тот же тип данных, что и подписанный и unsigned.

Мне также известно, что в файле заголовка type_traits есть std :: is_signed или std :: is_unsigned. Я не мог понять, как использовать их в этом контексте.

EDIT

Частичный Полный код

#define BYTE 1 

template <size_t N> 
struct alias; 

#define REGISTER_ALIAS(X)   \ 
template <>       \ 
struct alias <sizeof(X)> {   \ 
      using Type = X;   \ 
}; 

REGISTER_ALIAS(unsigned char) 
REGISTER_ALIAS(signed char) 

using int8 = alias<BYTE>::Type; 
using uint8 = alias<BYTE>::Type; 
+0

Что вы в конечном итоге пытаетесь сделать с этим 'alias' структурами? Какой контекст вы планируете использовать? – qxz

+0

Создание типов данных фиксированной ширины без жестко заданных typedef. – ugar

+3

Похоже, вам просто нужен еще один параметр шаблона. – Barry

ответ

1

Это то, что я сделал.

enum Sign { 
    SIGNED, 
    UNSIGNED 
}; 

template <size_t SIZE, Sign SIGN> 
struct Alias; 

template <> 
struct Alias<1, SIGNED> { 
    using type = int8_t; 
}; 
//etc 
+0

Проблема с этим решением по-прежнему требует жесткого кодирования. Я хочу, чтобы все было выведено компилятором, включая подпись. Сначала вы отмечаете шаблон, который должен быть ПОДКЛЮЧЕН вручную и псевдоним. Я хочу, чтобы данное значение было помечено как подписанное или неподписанное компилятором. – ugar

0

Я не понимаю, что вы хотите.

Но я полагаю, что вам нужно каким-то образом указать, что вам нужен тип подписанного или неподписанного типа.

Я предлагаю следующий способ, основанное на нескольких различных типов и явного выборе

template <size_t N> 
struct alias; 

template<> 
struct alias<sizeof(char)>{ 
    using sType = signed char; 
    using uType = unsigned char; 
}; 

using uint8 = alias<1>::uType; 
using int8 = alias<1>::sType; 
+0

Например, я могу специализировать структуру псевдонимов с неподписанными и подписанными символами без каких-либо проблем во время компиляции. Предполагая, что char имеет только 1 байт, вызывается псевдоним <1> :: Тип возвращает любую специализацию по псевдониму для типа данных char, хотя сначала существует две специализации. Я хочу иметь возможность использовать как подписанную, так и unsigned char. В основном есть две специализации, которые соответствуют 1. Есть ли способ использовать меня? – ugar

+0

@nomadov - Я не знаю, как; как компилятор может понять при использовании подписанной версии и когда неподписанный? – max66