确定功能主体中的返回类型

decide return type in function body

本文关键字:返回类型 主体 功能      更新时间:2023-10-16

我想做什么:

 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");
}

我之所以包括在内,是因为技术您正在确定功能体内的返回类型,但是实际上不可能推导函数外返回的类型,并且可能会引入许多内存泄漏和难以调试错误。