为什么 std::arrays 会破坏带有类型检查的模板函数?

我有一个模板函数,它根据提供的类型执行某些操作。

template<typename T>
T read()
{
    if (std::is_integral<T>()) {
        return static_cast<T>(std::stoi(readToken()));
    }
    else if (std::is_same<T, float>()) {
        return std::stof(readToken());
    }
    else if (std::is_same<T, std::array<float, 3>>()) {
        return { read<float>, read<float>, read<float> };
    }
    else throw std::logic_error("Invalid type");
}

编译器给出以下警告 read<int>() 被调用。

控制达到非虚函数的结束

解决方案:

read 是模板。每次实例化这个模板时,整个函数的主体都会由编译器生成。当你调用 read<int>() 设有 array 也被编译了,但不能将数组分配给返回类型,而返回类型是 int. 这就是为什么你会得到这个错误。

在g++7.3下,你可以使用 如果conexpr 结构。有了这个,在一个范围内的行 如果 条件为真时才会被编译。

template<typename T>
T read() {
    if constexpr (std::is_integral<T>()) {
        return static_cast<T>(std::stoi(readToken()));
    }
    else if constexpr (std::is_same<T, float>()) {
        return std::stof(readToken());
    }
    else if constexpr (std::is_same<T, std::array<float, 3>>()) {
        std::array<float, 3> arr;
        arr.at(0) = 4; arr.at(1) = 2; arr.at(2) = 0;
        return arr;
    }
    else throw std::logic_error("Invalid type");
}

在c++17之前,你调用助记函数,而助记函数对你想处理的所有类型都是重载的。

template<class T>
T readHelper() {
    throw std::runtime_error("invalid type");
}

// here provide types you want to be handled
template<>
int readHelper<int>() {  return std::stoi(readToken());  }

template<>
float readHelper<float>() { return std::stof(readToken()); }

template<>
std::array<float,3> readHelper<std::array<float,3>>() {
    return std::array<float,3>{};
}

template<class T>
T read2(){
    return readHelper<T>();
}

Demo

给TA打赏
共{{data.count}}人
人已打赏
解决方案

梯度下降算法和不同的学习率

2022-5-14 5:00:17

解决方案

Input

2022-5-14 5:00:19

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索