Как передать переменную перечисления в структуру со специализацией шаблона для перечисления ⇐ C++
Как передать переменную перечисления в структуру со специализацией шаблона для перечисления
Я создаю структуру со специализацией шаблона для перечисления, например:
шаблон структура TypeTrait; шаблон структура TypeTrait { статический constexpr uint32_t size = sizeof(int8_t); }; шаблон структура TypeTrait { статический constexpr uint32_t size = sizeof(int16_t); }; шаблон структура TypeTrait { статический constexpr uint32_t size = sizeof(uint16_t); }; шаблон структура TypeTrait { статический constexpr uint32_t size = sizeof(uint8_t); }; шаблон структура TypeTrait { статический constexpr uint32_t size = sizeof(uint16_t); }; шаблон структура TypeTrait { статический constexpr uint32_t size = sizeof(int32_t); }; шаблон структура TypeTrait { статический constexpr uint32_t size = sizeof(uint32_t); }; шаблон структура TypeTrait { статический constexpr uint32_t size = sizeof(float); }; enum DataType определяется следующим образом:
enum DataType { ДАННЫЕ_ТИП_INT8 = 0, ДАННЫЕ_ТИП_INT16 = 1, ДАННЫЕ_ТИП_FP16 = 2, ДАННЫЕ_ТИП_UINT8 = 3, ДАННЫЕ_ТИП_UINT16 = 4, ДАННЫЕ_ТИП_INT32 = 5, DATA_TYPE_UINT32 = 6, ДАННЫЕ_ТИП_FP32 = 7, DATA_TYPE_UNKOWN }; И я хочу передать переменную DataType в структуру TypeTrait, вот так:
класс Тест { публика: ... недействительный Конвертировать () { ... uint32_t size = TypeTrait::size; ... } частный: Тип данных тип_; }; Когда я это делаю, возникает проблема при компиляции моей программы:
main.cc: В функции-члене void Test::Convert(): main.cc:63:35: ошибка: использование «this» в постоянном выражении 63 | uint32_t size = TypeTrait::size; | ^~~~~ main.cc:63:40: ошибка: использование «this» в постоянном выражении 63 | uint32_t size = TypeTrait::size; | ^ main.cc:63:35: примечание: в аргументе шаблона для типа DataType. 63 | uint32_t size = TypeTrait::size; | ^~~~~ ^ Я пробовал много способов, например преобразовать type_ в константное значение, например:
const DataType dataType = type_; uint32_t size = TypeTrait::size; Потом и возникла эта проблема.
main.cc: В функции-члене void Test::Convert(): main.cc:63:39: ошибка: значение «типа» невозможно использовать в постоянном выражении 63 | uint32_t size = TypeTrait::size; | ^ main.cc:62:24: примечание: «тип» не был инициализирован постоянным выражением 62 | тип const DataType = GetType(); | ^~~~ main.cc:63:39: примечание: в аргументе шаблона для типа DataType. 63 | uint32_t size = TypeTrait::size; |
Я знаю, что с программой не возникнет проблем, если я передам элемент перечисления таким образом.
uint32_t size = TypeTrait::size; Я понятия не имею, как решить эту проблему. Поэтому мне приходится использовать переключатель, чтобы справиться с этим, что противоречит моему желанию. Я просто хочу убрать регистр переключателей в своих кодах. Код, подлежащий рефакторингу:
переключатель (dataType_) { случай DATA_TYPE_INT8: byteSize = elemCnt * sizeof(int8_t); перерыв; случай DATA_TYPE_INT16: byteSize = elemCnt * sizeof(int16_t); перерыв; случай DATA_TYPE_FP16: byteSize = elemCnt * sizeof(uint16_t); перерыв; случай DATA_TYPE_UINT8: byteSize = elemCnt * sizeof(uint8_t); перерыв; случай DATA_TYPE_UINT16: byteSize = elemCnt * sizeof(uint16_t); перерыв; случай DATA_TYPE_INT32: byteSize = elemCnt * sizeof(int32_t); перерыв; случай DATA_TYPE_UINT32: byteSize = elemCnt * sizeof(uint32_t); перерыв; случай DATA_TYPE_FP32: byteSize = elemCnt * sizeof(float); перерыв; }
Я создаю структуру со специализацией шаблона для перечисления, например:
шаблон структура TypeTrait; шаблон структура TypeTrait { статический constexpr uint32_t size = sizeof(int8_t); }; шаблон структура TypeTrait { статический constexpr uint32_t size = sizeof(int16_t); }; шаблон структура TypeTrait { статический constexpr uint32_t size = sizeof(uint16_t); }; шаблон структура TypeTrait { статический constexpr uint32_t size = sizeof(uint8_t); }; шаблон структура TypeTrait { статический constexpr uint32_t size = sizeof(uint16_t); }; шаблон структура TypeTrait { статический constexpr uint32_t size = sizeof(int32_t); }; шаблон структура TypeTrait { статический constexpr uint32_t size = sizeof(uint32_t); }; шаблон структура TypeTrait { статический constexpr uint32_t size = sizeof(float); }; enum DataType определяется следующим образом:
enum DataType { ДАННЫЕ_ТИП_INT8 = 0, ДАННЫЕ_ТИП_INT16 = 1, ДАННЫЕ_ТИП_FP16 = 2, ДАННЫЕ_ТИП_UINT8 = 3, ДАННЫЕ_ТИП_UINT16 = 4, ДАННЫЕ_ТИП_INT32 = 5, DATA_TYPE_UINT32 = 6, ДАННЫЕ_ТИП_FP32 = 7, DATA_TYPE_UNKOWN }; И я хочу передать переменную DataType в структуру TypeTrait, вот так:
класс Тест { публика: ... недействительный Конвертировать () { ... uint32_t size = TypeTrait::size; ... } частный: Тип данных тип_; }; Когда я это делаю, возникает проблема при компиляции моей программы:
main.cc: В функции-члене void Test::Convert(): main.cc:63:35: ошибка: использование «this» в постоянном выражении 63 | uint32_t size = TypeTrait::size; | ^~~~~ main.cc:63:40: ошибка: использование «this» в постоянном выражении 63 | uint32_t size = TypeTrait::size; | ^ main.cc:63:35: примечание: в аргументе шаблона для типа DataType. 63 | uint32_t size = TypeTrait::size; | ^~~~~ ^ Я пробовал много способов, например преобразовать type_ в константное значение, например:
const DataType dataType = type_; uint32_t size = TypeTrait::size; Потом и возникла эта проблема.
main.cc: В функции-члене void Test::Convert(): main.cc:63:39: ошибка: значение «типа» невозможно использовать в постоянном выражении 63 | uint32_t size = TypeTrait::size; | ^ main.cc:62:24: примечание: «тип» не был инициализирован постоянным выражением 62 | тип const DataType = GetType(); | ^~~~ main.cc:63:39: примечание: в аргументе шаблона для типа DataType. 63 | uint32_t size = TypeTrait::size; |
Я знаю, что с программой не возникнет проблем, если я передам элемент перечисления таким образом.
uint32_t size = TypeTrait::size; Я понятия не имею, как решить эту проблему. Поэтому мне приходится использовать переключатель, чтобы справиться с этим, что противоречит моему желанию. Я просто хочу убрать регистр переключателей в своих кодах. Код, подлежащий рефакторингу:
переключатель (dataType_) { случай DATA_TYPE_INT8: byteSize = elemCnt * sizeof(int8_t); перерыв; случай DATA_TYPE_INT16: byteSize = elemCnt * sizeof(int16_t); перерыв; случай DATA_TYPE_FP16: byteSize = elemCnt * sizeof(uint16_t); перерыв; случай DATA_TYPE_UINT8: byteSize = elemCnt * sizeof(uint8_t); перерыв; случай DATA_TYPE_UINT16: byteSize = elemCnt * sizeof(uint16_t); перерыв; случай DATA_TYPE_INT32: byteSize = elemCnt * sizeof(int32_t); перерыв; случай DATA_TYPE_UINT32: byteSize = elemCnt * sizeof(uint32_t); перерыв; случай DATA_TYPE_FP32: byteSize = elemCnt * sizeof(float); перерыв; }
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как исключить объявление переменных со специализацией шаблона? [дубликат]
Anonymous » » в форуме C++ - 0 Ответы
- 35 Просмотры
-
Последнее сообщение Anonymous
-
-
-
ODB: сопоставление типов PostgreSQL Numeric с C++ int со специализацией value_traits
Anonymous » » в форуме C++ - 0 Ответы
- 38 Просмотры
-
Последнее сообщение Anonymous
-