决定函数体中的返回类型

时间:2018-04-25 21:59:47

标签: c++

我想做什么:

CardViews

我看过使用模板,但我不确定如何根据这样的条件设置返回类型。

编辑:我知道还有其他方法可以做到这一点,但我试图在函数中完成所有操作。显然,它并不像我想要的那么容易,至少在C ++中是这样。谢谢你的回答

4 个答案:

答案 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