2017-02-02 2 views
0

Недавно я попытался написать сумочку. Во многих частях моего кода мне нужно было решить, основываясь на пользовательском вводе. Для экземпляра мне нужно было выбрать мой тип буфера на основе пользовательского ввода 8 бит или 16 единиц. Я реализовал этот код и он сделал свою работу:Есть ли элегантный способ решить только один раз в соответствии с пользовательским вводом?

if (requestedbitsNumber == 8) 
    mxMalloc(sizeof(unsigned __int8)*NumberOfElements); 
if (requestedbitsNumber == 16) 
    mxMalloc(sizeof(unsigned __int16)*NumberOfElements); 

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

if (requestedbitsNumber == 8) 
    #define dataType unsigned __int8 
if (requestedbitsNumber == 16) 
    #define dataType unsigned __int16 

и использовать datType везде, где это необходимо. Я знаю, что #define является препроцессорной директивой и используется до того, как код даже скомпилирован. Я использовал его, чтобы показать, что я имею в виду. Благодарю.

+1

Вместо «хранение» тип данных, вы могли бы просто иметь некоторые 'size_t' переменную, которые вы установили в 'SizeOf (unsigned __intX) '(где X - правильное число). В качестве альтернативы просто выполните 'mxMalloc (requestbitsNumber/8 * NumberOfElements);'. – Cornstalks

+0

Вы правы, когда я создаю свой буфер. Но как насчет того, где мне нужно наложить указатель на пустоту на определенный тип. Что-то вроде 'myUin16Pointer = (unsigned __int16 *) myVoidPointer;' – GntS

ответ

1

template<class YourIntegerType>.

Так вы пишете что-то вроде:

if (requestedbitsNumber == 8) 
    X<unsigned __int8>(); 
if (requestedbitsNumber == 16) 
    X<unsigned __int16>(); 

Вы можете реализовать X как функция или класс.


Чтобы бросить указатель вы можете написать что-то внутри X:

pointerToInteger = (YourIntegerType *) myVoidPointer;

+0

Не могли бы вы объяснить, как я могу наложить указатель на void на определенный тип с помощью вашего предложения? – GntS

+0

Мне нужно, чтобы кастинг был передан аргументам моей функции. Предположим, что у меня есть функция вроде: 'myFunction ((unsigned __int16 *) myVoidPointer)'. Как использовать 'X' для этого? Прошу прощения, если это тривиально. Я новичок. – GntS

+0

@GmtK реализует 'myFunction' как функцию-член класса' X'. – cshu