在 C++ 中过滤类型名
Filter typenames in C++
这是我的字节数组(矢量)转换器。
template<typename T>
void put(T value) {
int size = sizeof(value);
uint8_t *array;
array = reinterpret_cast<uint8_t *>(&value);
if (littleEndian) {
for (int i = 0; i < size; i++) {
arr.push_back(array[i]);
}
} else {
for (int i = size - 1; i >= 0; i--) {
arr.push_back(array[i]);
}
}
}
如您所见,此函数接受所有变量类型。是否可以过滤类型名称?例如。我只想允许uint8_t, int8_t, uint16_t, int16_t etc. + float and double too
?我不想做 10 if
语句,因为它看起来不干净。
您可以使用 std::is_integral
和 SFINAE 来完成此操作。如果类型不是整数类型,这将从考虑中删除模板。它看起来像
template<typename T, typename std::enable_if<std::is_integral<T>::value>::type* = nullptr>
void put(T value)
{
// code
}
如果您想要允许所有整数和浮点类型,那么您可以使用 std::is_arithmetic
like
template<typename T, typename std::enable_if<std::is_arithmetic<T>::value>::type* = nullptr>
void put(T value)
{
// code
}
您似乎需要一个只接受任何整数类型的函数。
<type_traits>
header called std::is_integral
有一个现有的类型特征。您可以将它与 std::enable_if
一起使用以产生预期的约束:
template<typename T, std::enable_if_t<std::is_integral<T>::value, int> = 0>
void put(T value) {
constexpr int size = sizeof(value);
uint8_t *array;
array = reinterpret_cast<uint8_t *>(&value);
if (littleEndian) {
for (int i = 0; i < size; i++) {
arr.push_back(array[i]);
}
} else {
for (int i = size - 1; i >= 0; i--) {
arr.push_back(array[i]);
}
}
}
你的函数现在不能用非整数类型调用。
请注意,如果函数有另一个重载,编译器也会尝试重载。这意味着如果您有另一个接受任何浮点类型的函数,编译器将 select 适当的重载。
这是我的字节数组(矢量)转换器。
template<typename T>
void put(T value) {
int size = sizeof(value);
uint8_t *array;
array = reinterpret_cast<uint8_t *>(&value);
if (littleEndian) {
for (int i = 0; i < size; i++) {
arr.push_back(array[i]);
}
} else {
for (int i = size - 1; i >= 0; i--) {
arr.push_back(array[i]);
}
}
}
如您所见,此函数接受所有变量类型。是否可以过滤类型名称?例如。我只想允许uint8_t, int8_t, uint16_t, int16_t etc. + float and double too
?我不想做 10 if
语句,因为它看起来不干净。
您可以使用 std::is_integral
和 SFINAE 来完成此操作。如果类型不是整数类型,这将从考虑中删除模板。它看起来像
template<typename T, typename std::enable_if<std::is_integral<T>::value>::type* = nullptr>
void put(T value)
{
// code
}
如果您想要允许所有整数和浮点类型,那么您可以使用 std::is_arithmetic
like
template<typename T, typename std::enable_if<std::is_arithmetic<T>::value>::type* = nullptr>
void put(T value)
{
// code
}
您似乎需要一个只接受任何整数类型的函数。
<type_traits>
header called std::is_integral
有一个现有的类型特征。您可以将它与 std::enable_if
一起使用以产生预期的约束:
template<typename T, std::enable_if_t<std::is_integral<T>::value, int> = 0>
void put(T value) {
constexpr int size = sizeof(value);
uint8_t *array;
array = reinterpret_cast<uint8_t *>(&value);
if (littleEndian) {
for (int i = 0; i < size; i++) {
arr.push_back(array[i]);
}
} else {
for (int i = size - 1; i >= 0; i--) {
arr.push_back(array[i]);
}
}
}
你的函数现在不能用非整数类型调用。
请注意,如果函数有另一个重载,编译器也会尝试重载。这意味着如果您有另一个接受任何浮点类型的函数,编译器将 select 适当的重载。