Я создал мелкий инструмент, который используется для обработки двоичных файлов. Все функции, вовлеченные в чтение файлов и обработку их, являются шаблонными и являются подобными этому:
template <class T> void processFile( const char* fileName );
Шаблонный параметр T
используется для определения размера данных, которые будут считывать и рассматривать как один объект. Я не знаю, как сказать это точно, таким образом, крошечный пример (отмечают, что это двоичные данные, как замечено с hexeditor). Содержание файла:
BEEF1234DEAD5678
С T
будучи неподписанным символом, объекты: BE EF 12 34 DE AD 56 78
С T
будучи неподписанным интервалом, объекты: BEAF1234 DEAD5678
С T
быть двойным: BEAF1234DEAD5678
(Обратите внимание, что я принимаю здесь это unsigned char
1 байт, unsigned int
4 байта и double
8 байтов шириной.) T
также используется для контейнеров STL, потому что я использую их много (вектор, карта и список используются во многих функциях, вовлеченных в обработку файлов). Все работает превосходное со встроенными типами данных (символ, интервал и т.д.).
Теперь что является моей проблемой: Я хотел бы смочь работать с размерами, отличающимися от 1,4,8. Например, 16, 32 или даже 6, 10, 14 и т.д. Насколько я знаю, нет никаких встроенных типов этих размеров. Как я могу достигнуть этого? Мое основное беспокойство - то, что я нуждаюсь в данных в контейнерах STL и использую вид (), например. Структура POD будет работать? Обратите внимание, что я использую главным образом C функции для чтения (никакие потоки здесь, но некоторый memcpy и memcmp, освобожденный и т.д.).
Извините за не предоставление большего количества кода я использую свой запасной ноутбук теперь. Но я полагаю, что больше кода не должно быть необходимым. Если так, завтра я обеспечу его.
Если я правильно понял ваш вопрос, то ответ положительный: вы должны быть в состоянии специализировать вашу функцию шаблона с подходящим типом POD. Однако вам потребуется определить член operator<()
, чтобы иметь возможность использовать std::sort()
.
Следующий POD может быть полезен вам в общем случае (он, конечно, будет сортировать лучше, чем парные):
template <int N>
struct MyFill{
char contents[N];
bool operator<(const MyFill<N>& other){
for (int i=0; i<N; ++i){
if (contents[i]!=other.contents[i]){
return (contents[i]<other.contents[i]);
}
}
return false;
}
};
Используйте operator<< для извлечения данных. Таким образом, размер T и то, можно ли его отсортировать, не является вашей проблемой. Так что берите потоки C++, не зря же мы отказались от fscanf в пользу std::ifstream.
На самом деле небезопасно использовать memcpy или memcmp для многих, многих типов C++, и их использование - это привычка, от которой вам определенно стоит отказаться.