Шаблонный массив в VC ++ 2008 - PullRequest
       12

Шаблонный массив в VC ++ 2008

0 голосов
/ 15 сентября 2009

Я пытаюсь открыть файл (ы) необработанных данных, которые содержат некоторые числа, используя VC ++. Числа могут быть 8/16/24 бит. У меня есть предварительные знания об этом для данного файла.

Могу ли я использовать шаблоны C ++ для создания переменных массива для хранения чисел, считываемых из файлов, исходя из их разрядности? Что-то в строках этого псевдокода:

if(BitDepth==8)
{
    CTemplate<unsigned byte> data; // data type should be unsigned byte
    Read8Bit(data);
    //.. various ops to read 8 bit data
}

if(BitDepth==16)
{
    CTemplate<unsigned short> data; // data type should be unsigned short
    Read16Bit(data);
    //.. various ops to read 16 bit data
}

if(BitDepth==24)
{
    CTemplate<unsigned int> data; // data type should be unsigned int
    Read24Bit(data);
    //.. various ops to read 24 bit data
}

//Later use 'data' out of scope of if() conditionals

Конечно, переменная шаблона 'data' должна использоваться позже вне области условий if (). Поэтому мне нужно объявить «данные» как глобальные (скажем, в заголовке). Я теряю трек здесь ...

Ответы [ 2 ]

1 голос
/ 15 сентября 2009

Если битовая глубина не является постоянной времени компиляции, у вас есть два варианта:

1) использовать объекты реализации переменных времени выполнения (реализации могут быть сгенерированы с использованием шаблонов, а не полиморфизма времени выполнения, но для их использования необходимо ввести erase для виртуального интерфейса или включить битовую глубину времени выполнения , для того, чтобы выбрать среди них).

2) сделать так, чтобы все вызывающие функции принимали битовую глубину в качестве параметра шаблона, вплоть до некоторого уровня, на котором вы выполняете вышеуказанную переменную времени выполнения -> конкретное отображение шаблона битовой глубины (по крайней мере, в основном вам придется это делать)

Да, вы можете иметь (постоянные) целочисленные аргументы шаблона и частичную специализацию для них.

0 голосов
/ 15 сентября 2009

Я бы просто объявил данные как БАЙТ *. Затем предоставьте класс-оболочку, который позволит извлекать элементы по индексу в соответствии с битовой глубиной. Имея такой класс, вы сможете изменять битовую глубину во время выполнения ...

Может быть, достаточно предоставить шаблонную функцию "at", которая принимает индекс и возвращает элемент указанного типа в массиве BYTE. Некоторое низкоуровневое программирование будет задействовано, но c ++ действительно хорош для этого!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...