确定功能主体中的返回类型
decide return type in function body
我想做什么:
foo(int x){
if (x>=3)
return x;
else
return "less than three";
}
我已经考虑使用模板,但是我不确定如何基于这样的条件设置返回类型。
编辑:我知道还有其他方法可以做到这一点,但是我试图将其全部获取在功能中。显然,至少在C 中,它并不像我想要的那样容易。谢谢您的回答
由于模板类型在编译时解决了模板类型,因此无法使用模板。
。我看到的程序工作的唯一方法是使用std :: variant,如果您有C 17,并且boost :: variant否则。那么您的功能看起来像
std::variant<int, std::string> foo(int x) {
if (x>=3)
return x;
else
return "less than three";
}
您也许可以在 x
上使用std :: to_string,如果它大于或等于3,则在do if
返回的字符串不等于3之后,然后将其类型更改回Integer。我希望这是有道理的。
您也可以通过写作如下来使其简单:
int foo(int x){
if(x>=3)
return x;
else
return 0; // Or any number less than 3
}
然后转到呼叫者类,如果返回的值为0
,则可以打印less than three
。
无论您必须将某些内容定义为函数的返回类型。但是,您可以通过各种方式使返回类型模棱两可。
如果该函数始终返回类型int
,除非出现问题,否则您可以创建包含成功结果或错误的包装器类型。
Maybe<int> m = foo(3);
if (m.is_error) {
// Stuff
} else {
// Different stuff
}
有关更多详细信息,请参见此答案
如果该功能始终返回几种类型之一,则可以返回std::tuple
std:tuple<int, string> foo(int x) {
if (x >= 3) {
return std::make_tuple(x, "");
}
return std::make_tuple(0, "less than three");
}
auto result = foo(4);
if (!std::get<1>(result).empty()) {
// An error is present
}
// In C++11
int num;
string err;
std::tie(num, err) = foo(3);
if (!err.empty()) {
// An error is present
}
// In C++17
int num;
string err;
auto [num, err] = foo(3);
if (!err.empty()) {
// An error is present
}
在C 17中,您可以(并且应该(使用std::variant
而不是元组。std::variant:::index()
或std::holds_alternative()
将告诉您持有哪种类型:
std::variant<int, string> foo(int x) {
std::variant<int, string> result;
if (x >= 3) {
result = x;
}
else {
result = "less than three";
}
return result;
}
auto result = foo(3);
if (result.index() == 1) {
// An error is present
}
auto result = foo(3);
if (std::holds_alternative<std::string>(result)) {
// An error is present
}
和技术上可能的 ,但极为愚蠢的想法,您可以随时返回void*
,然后稍后尝试解决问题:
void* reallyBad(int x) {
if (x >= 3) {
return new int(x);
}
return new string("Less than three");
}
我之所以包括在内,是因为技术您正在确定功能体内的返回类型,但是实际上不可能推导函数外返回的类型,并且可能会引入许多内存泄漏和难以调试错误。
相关文章:
- 如何获取std::result_of函数的返回类型
- 奇怪的结构&GCC&clang(void*返回类型)
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 函数作为模板参数,是否对返回类型强制约束
- C++中函数的向量返回类型引发错误
- 检查函数返回类型是否与STL容器类型值相同
- 为什么返回类型中需要typename?C++
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 为什么 c++(g++) 不允许模板返回类型和函数名称之间有空格?
- 为什么返回类型的'const'限定符对标有 __forceinline/内联的函数没有影响?
- 推导 std::vector::back() 的返回类型
- 在 c++ 中将函数返回类型指定为模板参数
- 使用 SWIG 更改生成的 CS 函数中的返回类型
- QtQuick - qml:28:错误:未知方法返回类型:自定义类型
- 如果函数是在类的主体中定义的,我是否需要在成员函数的返回类型中指定 typename?
- 确定功能主体中的返回类型