我一直在尝试使用模板编程对输入内容进行完整性检查。我的健全性检查功能如下
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);
}
}
我在main中调用函数如下
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);
我真的不确定我是否正确理解此错误。有人会善良地向我指出正确的方向吗?
谢谢!
simpleif
仍要求即使未选择分支也有效(您的函数确实返回所有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";
}
}
// ...
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句