我想做什么:
CardViews
我看过使用模板,但我不确定如何根据这样的条件设置返回类型。
编辑:我知道还有其他方法可以做到这一点,但我试图在函数中完成所有操作。显然,它并不像我想要的那么容易,至少在C ++中是这样。谢谢你的回答
答案 0 :(得分:2)
由于模板类型在编译期间得到解决,因此无法为您的问题使用模板。
我认为让你的程序有效的唯一方法是使用std::variant如果你有c ++ 17和boost::variant。然后你的功能看起来像
std::variant<int, std::string> foo(int x) {
if (x>=3)
return x;
else
return "less than three";
}
答案 1 :(得分:0)
你可以在x
上使用std :: to_string,如果它大于或等于3,那么在do if
后返回的字符串不等于3,然后将其类型改回整数。我希望这是有道理的。
答案 2 :(得分:0)
无论您需要将某些内容定义为函数的返回类型。但是,您可以通过各种方式使返回类型模糊不清,有些方法比其他方式更好。
如果函数始终返回类型int
,除非出现问题,您可以创建包含成功结果或错误的包装类型。
Maybe<int> m = foo(3);
if (m.is_error) {
// Stuff
} else {
// Different stuff
}
有关详细信息,请参阅this answer
如果该函数始终返回少数几种类型中的一种,则可以返回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");
}
我只包含这个因为技术上你决定函数体中的返回类型,但实际上不可能推断出函数外部的返回类型,并且可能会引入许多内存泄漏和难以调试错误。
答案 3 :(得分:0)
您也可以通过以下方式简化:
int foo(int x){
if(x>=3)
return x;
else
return 0; // Or any number less than 3
}
然后转到调用者类,如果返回的值是0
,则可以打印less than three
。