SK
Size: a a a
SK
ID
SK
template<uint8_t Bits_minus_1_div_8> struct CRC_Type_helper{ typedef uint64_t value_type; }; // default
template<> struct CRC_Type_helper<0> { typedef uint8_t value_type; }; //for Bits 1..8
template<> struct CRC_Type_helper<1> { typedef uint16_t value_type; }; //for Bits 9..16
template<> struct CRC_Type_helper<2> { typedef uint32_t value_type; }; //for Bits 17..24
template<> struct CRC_Type_helper<3> { typedef uint32_t value_type; }; //for Bits 25..32
#define CRC_TYPE typename CRC_Type_helper< (Bits-1)/8 >::value_type
SS
АК
template<uint8_t Bits_minus_1_div_8> struct CRC_Type_helper{ typedef uint64_t value_type; }; // default
template<> struct CRC_Type_helper<0> { typedef uint8_t value_type; }; //for Bits 1..8
template<> struct CRC_Type_helper<1> { typedef uint16_t value_type; }; //for Bits 9..16
template<> struct CRC_Type_helper<2> { typedef uint32_t value_type; }; //for Bits 17..24
template<> struct CRC_Type_helper<3> { typedef uint32_t value_type; }; //for Bits 25..32
#define CRC_TYPE typename CRC_Type_helper< (Bits-1)/8 >::value_type
SK
SK
N
АК
#include <cstdint>
template <std::size_t Bits>
auto detect_type() {
if constexpr (Bits <= 8) {
return std::uint8_t{};
}
else if constexpr (Bits <= 16) {
return std::uint16_t{};
}
else if constexpr (Bits <= 32) {
return std::uint32_t{};
}
else {
static_assert(Bits <= 64);
return std::uint64_t{};
}
}
template <std::size_t Bits> using storage_for = decltype(detect_type<Bits>());
static_assert(std::is_same_v<storage_for<1>, std::uint8_t>);
static_assert(std::is_same_v<storage_for<5>, std::uint8_t>);
static_assert(std::is_same_v<storage_for<12>, std::uint16_t>);
static_assert(std::is_same_v<storage_for<17>, std::uint32_t>);
SK
#include <cstdint>
template <std::size_t Bits>
auto detect_type() {
if constexpr (Bits <= 8) {
return std::uint8_t{};
}
else if constexpr (Bits <= 16) {
return std::uint16_t{};
}
else if constexpr (Bits <= 32) {
return std::uint32_t{};
}
else {
static_assert(Bits <= 64);
return std::uint64_t{};
}
}
template <std::size_t Bits> using storage_for = decltype(detect_type<Bits>());
static_assert(std::is_same_v<storage_for<1>, std::uint8_t>);
static_assert(std::is_same_v<storage_for<5>, std::uint8_t>);
static_assert(std::is_same_v<storage_for<12>, std::uint16_t>);
static_assert(std::is_same_v<storage_for<17>, std::uint32_t>);
АК
template <std::size_t Bits>
auto detect_type() {
if constexpr (Bits <= 8) { return std::uint8_t{}; }
else if constexpr (Bits <= 16) { return std::uint16_t{}; }
else if constexpr (Bits <= 32) { return std::uint32_t{}; }
else { static_assert(Bits <= 64); return std::uint64_t{}; }
}
SK
template <std::size_t Bits>
auto detect_type() {
if constexpr (Bits <= 8) { return std::uint8_t{}; }
else if constexpr (Bits <= 16) { return std::uint16_t{}; }
else if constexpr (Bits <= 32) { return std::uint32_t{}; }
else { static_assert(Bits <= 64); return std::uint64_t{}; }
}
SS
template <int N>Думаю, на 03 это тоже можно написать без проблем. Ну и вместо nullptr_t что-нибудь получше придумать, чтобы ошибка была
using type = std::conditional_t<N <= 8, int8_t,
std::conditional_t<N <= 16, int16_t,
std::conditional_t<N <= 32, int32_t,
std::conditional_t<N <= 64, int64_t, std::nullptr_t>>>>;
SS
..
ID
SK
template <int N>Думаю, на 03 это тоже можно написать без проблем. Ну и вместо nullptr_t что-нибудь получше придумать, чтобы ошибка была
using type = std::conditional_t<N <= 8, int8_t,
std::conditional_t<N <= 16, int16_t,
std::conditional_t<N <= 32, int32_t,
std::conditional_t<N <= 64, int64_t, std::nullptr_t>>>>;
std::traits<bits>::uint_type
просто не получилось загуглитьD
std::traits<bits>::uint_type
просто не получилось загуглитьSS