繁体   English   中英

C++ 具有灵活返回类型的函数模板

[英]C++ Funtion template with flexible return type

我一直在尝试使用模板编程对输入进行完整性检查。 我的健全性检查 function 如下所示

template<typename T> T getInput(std::string& _input) {
std::cin >> _input;
if(std::is_same<T, int>::value) {
    try{
        auto result=std::stoi(_input);
        return(result);
    }
    catch(std::invalid_argument& except) {
        std::cout << except.what() << "\n";
    }
}
else if(std::is_same<T, unsigned int>::value) {
    try{
        auto result=std::stoul(_input);
        return(result);
    }
    catch(std::invalid_argument& except) {
        std::cout << except.what() << "\n";
    }
}
else if(std::is_same<T, float>::value) {
    try{
        auto result=std::stof(_input);
        return(result);
    }
    catch(std::invalid_argument& except) {
        std::cout << except.what() << "\n";
    }
}
else if(std::is_same<T, std::string>::value) {
    auto result = _input;
    return(result);
}
else {
    std::cerr << "Unknown input type!\n";
    std::exit(1);
}
}

我将 function 称为主要如下

int main() {
std::string _input = "10";
std::cout << "Enter value:" <<  getInput<int>(_input) << '\n';
return(0);

但是,这会引发以下错误。

error: no viable conversion from returned value of type 'std::__cxx11::basic_string<char>' to function return type 'int'
    return(result);

我真的不确定我是否正确理解了这个错误。 有人可以为我指出正确的方向吗?

谢谢!

简单的if仍然需要即使未选中该分支也是有效的(您的 function 确实返回所有int / unsigned int / float / string )。

if constexpr允许“丢弃”未选择的分支(但需要编译时条件(您拥有))。

template<typename T>
T getInput(std::string& _input) {
    std::cin >> _input;

    if constexpr (std::is_same<T, int>::value) {
        try{
            auto result=std::stoi(_input);
            return(result);
        }
        catch(std::invalid_argument& except) {
            std::cout << except.what() << "\n";
        }
    }
    else if constexpr (std::is_same<T, unsigned int>::value) {
        try{
            auto result=std::stoul(_input);
            return(result);
        }
        catch(std::invalid_argument& except) {
            std::cout << except.what() << "\n";
        }
    }
    // ...

}

在 C++17 之前,您必须使用其他方式如专业化,标签调度,......

template<typename T> T getInput(std::string& _input);

template<> int getInput(std::string& _input)
{
    std::cin >> _input;

    try {
        auto result=std::stoi(_input);
        return(result);
    } catch(std::invalid_argument& except) {
        std::cout << except.what() << "\n";
    }
}

template<> unsigned int getInput(std::string& _input)
{
    try{
        auto result=std::stoul(_input);
        return(result);
    } catch(std::invalid_argument& except) {
        std::cout << except.what() << "\n";
    }
}
// ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM