Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C++;_C++_Templates_Reinterpret Cast_Typename - Fatal编程技术网

C++ 在C++;

C++ 在C++;,c++,templates,reinterpret-cast,typename,C++,Templates,Reinterpret Cast,Typename,这是我的字节数组(向量)转换器 模板 无效认沽权(T值){ int size=sizeof(值); uint8_t*阵列; 数组=重新解释强制转换(&U)值; 如果(小印度){ 对于(int i=0;i=0;i--){ arr.push_-back(数组[i]); } } } 如您所见,此函数接受所有变量类型。是否可以筛选类型名?例如,我只想允许uint8\u t、int8\u t、uint16\u t、int16\u t等+浮点和双精度?我不想做10个if语句,因为它看起来不干净。您可以使用

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

模板
无效认沽权(T值){
int size=sizeof(值);
uint8_t*阵列;
数组=重新解释强制转换(&U)值;
如果(小印度){
对于(int i=0;i=0;i--){
arr.push_-back(数组[i]);
}
}
}
如您所见,此函数接受所有变量类型。是否可以筛选类型名?例如,我只想允许
uint8\u t、int8\u t、uint16\u t、int16\u t等+浮点和双精度
?我不想做10个
if
语句,因为它看起来不干净。

您可以使用和SFINAE来实现这一点。如果该类型不是整数类型,这将从考虑中删除该模板。看起来像

template<typename T, typename std::enable_if<std::is_integral<T>::value>::type* = nullptr>
void put(T value)
{
    // code
}
您可以使用和SFINAE来完成此操作。如果该类型不是整数类型,这将从考虑中删除该模板。看起来像

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

看起来您需要一个只接受任何积分类型的函数

标头中已调用该un的现有类型特征。您可以将其与
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]);
        }
    }
}
模板
无效认沽权(T值){
constexpr int size=sizeof(值);
uint8_t*阵列;
数组=重新解释强制转换(&U)值;
如果(小印度){
对于(int i=0;i=0;i--){
arr.push_-back(数组[i]);
}
}
}
您的函数现在不能用非整数类型调用


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

似乎您需要一个只接受任何整数类型的函数

标头中已调用该un的现有类型特征。您可以将其与
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]);
        }
    }
}
模板
无效认沽权(T值){
constexpr int size=sizeof(值);
uint8_t*阵列;
数组=重新解释强制转换(&U)值;
如果(小印度){
对于(int i=0;i=0;i--){
arr.push_-back(数组[i]);
}
}
}
您的函数现在不能用非整数类型调用


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

是否可以添加浮点和双精度?@SzymonMarczak如果您想要整数和浮点类型,那么您需要使用非常感谢:)是否可以添加浮点和双精度?@SzymonMarczak如果您想要整数和浮点类型,那么您需要使用非常感谢:)什么是指向不同语句中的
数组
声明和赋值?指向不同语句中的
数组
声明和赋值的点是什么?