在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
}
<<p> 生活例子/kbd>

如果你想允许所有的整型和浮点型,那么你可以使用std::is_arithmetic,如

template<typename T, typename std::enable_if<std::is_arithmetic<T>::value>::type* = nullptr>
void put(T value)
{
    // code
}

看来你需要一个只接受任何整型的函数。

<type_traits>头中有一个名为std::is_integral的现有类型trait。您可以将它与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]);
        }
    }
}

你的函数现在不能用非整型调用。

注意,如果有另一个函数的重载,编译器也会尝试它。这意味着,如果您有另一个接受任何浮点类型的函数,编译器将选择适当的重载。

最新更新