Дублирование функции КПР – отличаются только в указатель против итератор подпись


Это КПР функция, порожденная pyCRC и изменено мной:

static inline crc_t crc_update(crc_t          crc, 
                               char const *   data, 
                               long long      data_len)
{
    while (data_len--) 
    {
        crc = (crc_table[(crc ^ *data) & 0xff] ^ (crc >> 8));
        ++data;
    }
    return crc;
}

Я сделал итератор версия:

static inline crc_t crc_update(crc_t                          crc, 
                               std::istreambuf_iterator<char> data, 
                               long long                      data_len)
{
   /* body identical to the above */
}

Есть ли способ я могу избежать дублирования? (Главная цель кода, чтобы быть быстрым.)



258
6
c++
задан 4 декабря 2011 в 02:12 Источник Поделиться
Комментарии
1 ответ

Очевидный способ это заменить тип, который меняется с шаблонного типа, такой:

template<typename T>
static inline crc_t crc_update(crc_t crc,
T data,
long long data_len)
{
while (data_len--)
{
crc = (crc_table[(crc ^ *data) & 0xff] ^ (crc >> 8));
++data;
}
return crc;
}

Или в словах: положить шаблон в передней части функции, и заменить все тип char const и * с Т.

Есть некоторые детали, о вставке имя_типа в некоторых случаях , чтобы помочь компилятору, но те не применимы в данном случае.

Чтобы предотвратить неправильное использование, можно добавить некоторые проверки, чтобы убедиться, что можно использовать только 8-битные типы. Однако, это продвинутая штука и не требуется, чтобы ответить на ваш вопрос.

5
ответ дан 4 декабря 2011 в 10:12 Источник Поделиться