При работе с шаблонами классов, есть ли способ указать конкретный размер, выведя из его типа?Вот пример псевдокода для представления того, что я пытаюсь спросить.
#include <bitset>
#include <cstdint>
namespace xxx {
#define BYTE 8
#define WORD 16
#define DWORD 32
#define QWORD 64
typedef std::uint8_t u8;
typedef std::uint16_t u16;
typedef std::uint32_t u32;
typedef std::uint64_t u64;
template<typename Type, u16 BitCount>
struct Register {
};
}
Я не знаю, могу ли я использовать частичную специализацию или полную специализацию, и я не знаю, как поступитьделая это.Я хотел бы сделать следующее:
- если
Type
== u8
, то BitCount
автоматически == BYTE
или 8
- если
Type
== u16
, то BitCount
автоматически == WORD
или 16
- если
Type
== u32
, то BitCount
автоматически == DWORD
или32
- если
Type
== u64
, то BitCount
автоматически == QWORD
или 64
Причина заключается в том, чтокогда дело доходит до класса выше с его членами, которых я еще не показал, но покажу здесь, это то, что один из его членов является std::bitset
template<typename Type, u16 BitCount>
struct Register {
Type value;
std::bitset<BitCount>
};
Да, я знаю, что могу создавать их какthis:
void someFunc() {
Register<u8, 8> r8;
Register<u16, 16> r16;
}
Но я бы хотел иметь возможность специализировать их, чтобы вам не приходилось передавать какие-либо типы аргументов, я надеялся, что они могут быть выведены из типов параметров, которыепередается в или, если просто передать тип, то часть размера является автоматической.Это было бы предпочтительным
void someFunc() {
Register<u8> r8;
}
// the class would automatically use `8` for its `std::bitset<8>` member.
Всегда будет однозначное соответствие его базового типа и размера в битах.
Этот тип создания недействителен:
Register<u32, 64> reg; // invalid type u32 can only be 32...
Есть ли какой-нибудь известный способ сделать это через специализацию, наследование, полиморфизм и т. Д .?