2009-09-14 2 views
0

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

Могу ли я использовать шаблоны 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 

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

ответ

1

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

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

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

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

+0

Большое спасибо за ответ! Я бы хотел иметь одну переменную Template (массив), которая может быть сделана 8/16/24 бит во время выполнения. Любые предложения по этому поводу? – user173438

+0

На самом деле, я уверен, что это стандартная проблема. Просто я не нахожу ссылок на решение. – user173438

+0

Да, это будет хорошо для переменной шаблона шаблона. Может быть проще иметь 3 именованных шаблона с элементом const (эквивалентно, вы можете иметь номер в качестве аргумента и частично специализироваться). –

0

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

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

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