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

C++ C++;具有灵活返回类型的函数模板,c++,function,templates,C++,Function,Templates,我一直在尝试使用模板编程对输入进行健全性检查。我的理智检查函数如下所示 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); } c

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

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);
}
}
template T getInput(std::string&\u输入){
标准:cin>>\u输入;
if(std::is_same::value){
试一试{
自动结果=标准::stoi(_输入);
返回(结果);
}
catch(std::无效的_参数&except){

std::coutsimple
if
即使未选中,仍要求分支有效(您的函数确实返回所有
int
/
无符号int
/
浮点值
/
字符串

如果constexpr
允许“放弃”未选择的分支(但需要编译时条件(您有))

模板
T getInput(标准::字符串和\u输入){
标准:cin>>\u输入;
如果constexpr(std::is_same::value){
试一试{
自动结果=标准::stoi(_输入);
返回(结果);
}
catch(std::无效的_参数&except){

std::coutsimple
if
即使未选中,仍要求分支有效(您的函数确实返回所有
int
/
无符号int
/
浮点值
/
字符串

如果constexpr
允许“放弃”未选择的分支(但需要编译时条件(您有))

模板
T getInput(标准::字符串和\u输入){
标准:cin>>\u输入;
如果constexpr(std::is_same::value){
试一试{
自动结果=标准::stoi(_输入);
返回(结果);
}
catch(std::无效的_参数&except){

如果你能使用C++17,你可以使用
如果constexpr
;否则,我认为这不可能你想要什么。你能告诉我为什么这不可能吗?我不明白“为什么”部分。无论
T
是什么类型,整个函数的类型都必须正确。不能从返回
int
的函数返回
std::string
。但我不一定返回字符串。对于int类型,我使用stoi()返回int函数。这就是让我困惑的地方。如果你能使用C++17,你可以使用
if constexpr
;否则,我认为这是不可能的。你想要什么。你能告诉我为什么这是不可能的吗?我不明白“为什么”部分。无论
T
是什么类型,整个函数的类型都必须正确。不能从返回
int
的函数返回
std::string
。但我不一定返回字符串。对于int类型,我使用stoi()返回int函数。这就是让我困惑的地方。嗨@Jarod42,这就解决了它。尽管我收到了以下警告。
警告:控件可能会到达非无效函数的末尾[-Wreturn type]
。你能解释一下我为什么会得到这个警告吗?谢谢从我的理解来看,这个警告似乎是因为
else{}中没有return语句而抛出的
condition。如果出现异常,您确实不会返回任何内容。Hi@Jarod42,这就解决了问题。尽管我收到了以下警告。
warning:控件可能会到达非void函数的末尾[-Wreturn type]
。您能解释一下我为什么会得到这个警告吗?谢谢从我的理解来看,这个警告似乎是因为在
else{}
条件中没有return语句而引发的。如果出现异常,您确实不会返回任何内容。
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);
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";
        }
    }
    // ...

}
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";
    }
}
// ...