Я пытаюсь восстановить тип массива на основе размера его элементов. Думаю, я не могу использовать для этого шаблоны. Есть ли способ добиться этого без операторов switch? Или, если это невозможно без операторов switch, есть ли способ встроить оператор switch в класс (caster). Мне нравится идея класса caster, потому что есть много функций, помимо копии, которые нуждаются в аналогичном преобразовании.
copy_region(uint8_t *, int);
copy_region(uint16_t *, int);
copy_region(uint32_t *, int);
void copier(uint8_t *ptr_element, int sz_element) {
copy_region( caster(sz_element, ptr_element), n);
}
Решение switch, которое у меня есть, выглядит следующим образом:
void copier(uint8_t *ptr_element, int sz_element) {
switch(sz_element){
case 1: copy_region( uint8_t*(ptr_element), n); break;
case 2: copy_region( uint16_t*(ptr_element), n); break;
case 4: copy_region( uint16_t*(ptr_element), n); break;
}
}
Я также думал об определении операций как функторов, чтобы у меня мог быть один оператор switch, но параметры для разных операций очень разные.
Редактировать:
Информация о типе не теряется. Я пытаюсь реализовать систему (библиотеку / фреймворк) с шаблонными буферами. У меня есть базовый класс буфера, основанный на элементе uint8_t. Этот класс существует, потому что мне нужно вставить буферы в список. Базовый класс буфера реализует операции с этими буферами. Пользователь указывает тип буфера в качестве аргумента шаблона для класса буфера, но библиотека видит только базовый класс буфера и информацию о типе (размера элемента достаточно для определения типа).