2016-09-21 9 views
1

Это мой конвертер в байтовый массив (вектор).Фильтр типов в C++

template<typename T> 
void put(T value) { 
    int size = sizeof(value); 

    uint8_t *array; 
    array = reinterpret_cast<uint8_t *>(&value); 

    if (littleEndian) { 
     for (int i = 0; i < size; i++) { 
      arr.push_back(array[i]); 
     } 
    } else { 
     for (int i = size - 1; i >= 0; i--) { 
      arr.push_back(array[i]); 
     } 
    } 
} 

Как вы можете видеть, эта функция принимает все типы переменных. Можно ли фильтровать типы имен? Например. Я хочу разрешить только uint8_t, int8_t, uint16_t, int16_t etc. + float and double too? Я не хочу делать заявления 10 if, потому что он не выглядит чистым.

+0

Какой смысл объявлять и присваивать значение 'array' в разных операторах? – Slava

ответ

5

Вы можете сделать это, используя std::is_integral и SFINAE. Это приведет к удалению шаблона из рассмотрения, если тип не является целым типом. Это будет выглядеть как

template<typename T, typename std::enable_if<std::is_integral<T>::value>::type* = nullptr> 
void put(T value) 
{ 
    // code 
} 

Live Example

Если вместо этого вы хотите разрешить все целые и плавающих типов, то вы можете использовать std::is_arithmetic как

template<typename T, typename std::enable_if<std::is_arithmetic<T>::value>::type* = nullptr> 
void put(T value) 
{ 
    // code 
} 
+0

Можно ли добавить float и double? –

+0

@SzymonMarczak Если вам нужны целые числа и типы с плавающей запятой, то вы хотите использовать ['std :: is_arithmetic'] (http://en.cppreference.com/w/cpp/types/is_arithmetic) – NathanOliver

+0

Спасибо большое :) –

1

кажется вам нужна функция, которая принимают только любые интегральные типы.

Существует признак существующего типа для этого заголовка <type_traits> под названием std::is_integral. Вы можете использовать его с std::enable_if для получения ожидаемого ограничения:

template<typename T, std::enable_if_t<std::is_integral<T>::value, int> = 0> 
void put(T value) { 
    constexpr int size = sizeof(value); 

    uint8_t *array; 
    array = reinterpret_cast<uint8_t *>(&value); 

    if (littleEndian) { 
     for (int i = 0; i < size; i++) { 
      arr.push_back(array[i]); 
     } 
    } else { 
     for (int i = size - 1; i >= 0; i--) { 
      arr.push_back(array[i]); 
     } 
    } 
} 

Вашей функция теперь не отозвана с не целочисленными типами.

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

 Смежные вопросы

  • Нет связанных вопросов^_^