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++11 为什么std::数组使用类型检查来破坏模板化函数?_C++11_Templates_Typetraits_Stdarray - Fatal编程技术网

C++11 为什么std::数组使用类型检查来破坏模板化函数?

C++11 为什么std::数组使用类型检查来破坏模板化函数?,c++11,templates,typetraits,stdarray,C++11,Templates,Typetraits,Stdarray,我有一个模板函数,它根据提供的类型执行某些操作: 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

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

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");
}
模板
T read()
{
if(std::is_integral()){
返回静态_cast(std::stoi(readToken());
}
else if(std::is_same()){
返回std::stof(readToken());
}
else if(std::is_same()){
返回{read,read,read};
}
else抛出std::logic_错误(“无效类型”);
}
调用
read()
时,编译器会发出以下警告:

控件到达非void函数的末尾


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

在g++7.3下,可以使用if constexpr构造。在此情况下,仅编译if条件为true的范围内的行:

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");
}
模板
T read(){
如果constexpr(std::is_integral()){
返回静态_cast(std::stoi(readToken());
}
否则如果constexpr(std::is_same()){
返回std::stof(readToken());
}
否则如果constexpr(std::is_same()){
std::阵列arr;
arr.at(0)=4;arr.at(1)=2;arr.at(2)=0;
返回arr;
}
else抛出std::logic_错误(“无效类型”);
}
在c++17之前,您可以调用helper函数,该函数对于要处理的所有类型都重载:

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>();
}
模板
T readHelper(){
抛出std::runtime_错误(“无效类型”);
}
//这里提供您想要处理的类型
模板
int readHelper(){return std::stoi(readToken());}
模板
float readHelper(){return std::stof(readToken());}
模板
std::array readHelper(){
返回std::数组{};
}
模板
T read2(){
返回readHelper();
}

如果未执行语句,则首先调用
read()
时,您说整数类型不被识别是什么意思?提供。@rafix07是的,这正是我的意思。你在用什么编译器?mingw7.3。感谢这个演示,当我在函数中添加std数组时,它才停止工作,不知道为什么。谢谢你的帮助,这样做的诀窍:)我编辑的问题,以反映实际问题。