在C++中过滤类型名称

Szy*_*zak 1 c++ templates typename reinterpret-cast

这是我的转换器到字节数组(向量).

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]);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,此函数接受所有变量类型.是否可以过滤类型名称?我想只允许uint8_t, int8_t, uint16_t, int16_t etc. + float and double too吗?我不想做10个if陈述,因为它看起来不干净.

Nat*_*ica 5

你可以使用std::is_integral和SFINAE 这样做.如果类型不是整数类型,这将删除模板.它看起来像

template<typename T, typename std::enable_if<std::is_integral<T>::value>::type* = nullptr>
void put(T value)
{
    // code
}
Run Code Online (Sandbox Code Playgroud)

Live Example

如果您想要允许所有积分和浮点类型,那么您可以使用std::is_arithmeticlike

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