template<size_t TSize, typename TBase=unsigned>
class CBin
{
protected:
TBase val : TSize;
public:
CBin() :val(0) {}
CBin(const CBin6& arg) :val(arg.val) {}
CBin(const TBase& arg) :val(arg) {}
operator TBase() const { return val; }
const CBin& operator ++() { val++; return *this; }
const CBin& operator --() { val--; return *this; }
const CBin& operator =(const uint6& arg) { val = arg.val; return *this; }
const CBin& operator *=(const uint6& arg) { val *= arg.val; return *this; }
..............................
// и т.для остальных операторов
};
// Использование:
typedef CBin<24> uint24;
typedef CBin<6,char> uint6;
uint6 a, b;
a = 17;
b = a++;
uint6 c = a + b;
Typedef
как создать свой тип данных, например unsigned mytype (int от 0 до 64)
Цитата:
Originally posted by kard
как создать свой тип данных, например unsigned mytype (int от 0 до 64)
как создать свой тип данных, например unsigned mytype (int от 0 до 64)
В смысле зафиксировать пределы.
Можно обявить свой класс и определить основные операторы, в которых можно отслеживать значения.
Цитата:
Originally posted by kard
как создать свой тип данных, например unsigned mytype (int от 0 до 64)
как создать свой тип данных, например unsigned mytype (int от 0 до 64)
Цитата:
typedef struct {
unsigned a: 6;
} uint6;
void f(void){
uint6 i;
i.a = 17;
}
Здесь поле a структуры uint6 - 6-битное, т.е. имеет диапазон значений от 0 до 63. (63 + 1 = 0!)
Если пишешь на С++, а не на С, то удобнее объявить класс и определить основные операторы, как уже сказал pavor. Тогда можно будет обращаться с переменной такого типа, как с обычными переменными, а не как с полем структуры.
Если нужно разнообразие нестандартных типов, то можно ввести шаблонный класс, что-то типа:
Код:
Возможно, подобный шаблонный класс уже описан в какой-либо общеизвестной библиотеке (STL, Boost и т.п.).
большое спасибо за помощь