为什么std :: arrays通过类型检查破坏模板化函数?

问题描述 投票:0回答:1

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

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>()时,编译器会发出以下警告:

控制到达非无效函数的结尾

c++11 templates typetraits stdarray
1个回答
1
投票

read是模板。每次实例化此模板时,编译器都会生成函数的整个主体。当您调用read<int>()时,也会编译带有array的段,但是无法将数组分配给返回类型int。这就是为什么您得到错误。

在g ++ 7.3下,您可以使用if constexpr构造。这样,仅编译if

条件为true的范围内的行:
© www.soinside.com 2019 - 2024. All rights reserved.