首页 > 解决方案 > 使用模板在 C++ 中进行类型转换

问题描述

C++中,有没有办法使用(例如)模板来简化下面的表达式?

std::stringstream data;
if (data_type == types::UINT8) {
    uint8_t val;
    data.read(reinterpret_cast<char*>(&val), sizeof(val));
    U.push_back(val);
} else if (data_type == types::UINT16) {
    uint16_t val;
    data.read(reinterpret_cast<char*>(&val), sizeof(val));
    U.push_back(val);
} else if (data_type == types::UINT32) {
    uint32_t val;
    data.read(reinterpret_cast<char*>(&val), sizeof(val));
    U.push_back(val);
} else if (data_type == types::UINT64) {
    uint64_t val;
    data.read(reinterpret_cast<char*>(&val), sizeof(val));
    U.push_back(val);
} else if (data_type == types::INT8) {
    int8_t val;
    data.read(reinterpret_cast<char*>(&val), sizeof(val));
    U.push_back(val);
} else if (data_type == types::INT16) {
    int16_t val;
    data.read(reinterpret_cast<char*>(&val), sizeof(val));
    U.push_back(val);
} else if (data_type == types::INT32) {
    int32_t val;
    data.read(reinterpret_cast<char*>(&val), sizeof(val));
    U.push_back(val);
} else if (data_type == types::INT64) {
    int64_t val;
    data.read(reinterpret_cast<char*>(&val), sizeof(val));
    U.push_back(val);
} else if (data_type == types::FLOAT64) {
    double val;
    data.read(reinterpret_cast<char*>(&val), sizeof(val));
    U.push_back(val);
} else {
    return false;
};

标签: c++c++11templatescasting

解决方案


创建一个函数模板来读取:

template<typename T>
void read(std::stringstream& data,TypeOfU& U){
  T val;
  data.read(reinterpret_cast<char*>(&val), sizeof(val));
  U.push_back(val);
}

然后使用switch

switch(data_type){
case types::INT64: read<int64_t>(data,u); break;
case types::FLOAT64: read<double>(data,u); break;
// etc.
}

推荐阅读