【问题标题】:How to have a function have different return type? C++如何让函数具有不同的返回类型? C++
【发布时间】:2019-05-04 13:33:50
【问题描述】:

我正在做一项作业,我的教授将这项任务作为作业的一部分交给了我们。我对 C++ 还是比较陌生,所以有什么帮助。我创建了这个函数,但是我不明白如果没有找到,他想如何返回一个空白字符串,但如果找到则返回一个整数。在没有重载函数的情况下,这是否可能?现在我只是将函数设置为整​​数类型,而不是返回空白字符串,而是返回 0。

这是作为分配的一部分的任务。如果您能解释您的解决方案,以便像我这样愚蠢的人能够理解,将不胜感激。

FindWord – 此成员函数将字符串作为参数并在 列表。如果列表为空或找不到,则返回空字符串值 (“”)。否则,它 返回索引的 int 值(例如数组元素编号,如 0、1、2 等)。 请记住 == 相等比较运算符适用于作为字符串处理的字符串 对象(而不是 char 数据元素)并且您不需要区分大小写。

编辑:这是我到目前为止的代码

int WordList::FindWord(string word){

if ((listSize = 0)){ // return -1 if no list exists;
    return -1;
}
else {
    for (int i =0;i<listSize;i++){ // run loop to check for word/        
        if (word == list[i]) // if word is found then return index
            return i;
     }        
        return -1; // return -1 if word is not found
   }
}

【问题讨论】:

  • 这是一个非常糟糕的分配...返回 -1 或 npos,好的,但是一个空白字符串?
  • 欢迎来到 Stack Overflow。请阅读the help pages,获取the SO tour,了解how to ask good questions,以及this question checklist。最后学习如何创建minimal reproducible example
  • 不,那是不可能的。要么你误解了你被要求做什么,要么你的老师是个白痴。我建议你问问你的老师,看不到 SO 能帮到你什么。
  • 您可以查看std::variant 对此,尽管我同意上述评论者的观点,该作业不是教授 c++ 的最佳选择,因为它令人困惑。我建议返回一个无效的位置,例如 -1,以表示未找到该字符串。
  • 在 c++ 中,每个函数都有签名 - 参数类型和返回值类型,因此您不能在一种情况下返回字符串,而在另一种情况下返回 int。话虽如此,您可以返回 std::any 之类的内容。你正在做的是(或看起来很像)std::find,所以你可以检查它是如何工作的(我假设如果你遵循标准库的“风格”,大多数人会发现更容易阅读你的代码)

标签: c++ return-type


【解决方案1】:

这可以通过 C++17 特性 std::variantstd::get_if 来完成。

  • 搜索函数将返回std::variant&lt;int, std::string&gt;
  • main 中使用std::get_if 来确定返回了哪些值。

std::get_if 返回指向存储在指向变量中的值的指针,或者返回空指针。

#include <variant>
#include <string>
#include <iostream>
#include <list>

 std::variant<int, std::string> strSearch(const std::string& searchStr, const std::list<std::string>& searchList)
 {
     int i = 0;
     for(const auto& s: searchList) {               
        if(!s.find(searchStr))
            return i;
        i++;    
     }
     return "";     
 }

int main()
{
    std::list<std::string> strList = {"stack", "stackover", "stackoverflow"};
    std::string str = "stackoverflow";
    std::variant<int, std::string> v{strSearch(str, strList)};
    if(std::get_if<int>(&v))
        std::cout << "String found. Index in the List is:" << std::get<int>(v) << '\n';
    else    
        std::cout << "String not found"  << '\n';

    str = "stackunderflow";
    v = strSearch(str, strList);
    if(std::get_if<int>(&v))
        std::cout << "String found. Index in the List is:" << std::get<int>(v)  << '\n';
    else    
        std::cout << "String not found."  << '\n';    

}

现场观看here

【讨论】:

  • 如果是 C++17,那么我会选择一个可选的,而不是返回一个空字符串。
  • @MatthieuBrucher:这里的问题是老师的人为要求。在这些限制条件下,这是最好的答案。但我敢打赌老师并没有预料到这个答案——问题的措辞告诉我们老师实际上对 C++ 并不那么熟悉。
  • 我知道问题的质量,请参阅我对问题的评论。
  • @SirCobalt:这能回答你的问题吗?
【解决方案2】:

这在 C++ 中是不可能的,一个函数只能定义一种返回类型。

这里有两种可能的情况:

1 返回一个包含整数和字符串并使用设置的结构体

E.G

struct returnData{
int returnCode;
std::string returnText;
}

returnData myFunc(std::string){}

2 可能会将您的搜索字符串用作输入/输出参数,但这比分配更没有意义,所以我不会深入探讨。

还有可能返回一个 void*(通用数据),然后将其转换为字符串或 int,但无法知道它应该是哪个。

我真的不知道您的教授对这项作业的期望是什么,因为根据参数返回不同的值实际上是不可能的,除非您同时返回它们并忽略其中一个。

【讨论】:

    【解决方案3】:

    你需要返回两个对象,你不能通过重载函数来做到这一点。

    所以你可以使用:

    std::pair<int, std::string> search(const std::string&, const std::list<std::string>& l);
    

    或者您可以通过传递对第二个对象的引用来返回第二个对象:

    std::string search(const std::string&, const std::list<std::string>& l, it& index);
    

    C++17 中的另一个选项是这样做的正确方法:

    std::optional<size_t> search(const std::string&, const std::list<std::string>& l);
    

    如果搜索成功,你会得到一个整数,否则你不会得到一个值。返回一个空字符串只是......

    【讨论】:

    • 似乎不太可能是问题所要求的。您如何判断两个返回值中的哪一个适用?
    • 简单。字符串的返回值可能是您传入的字符串,因此您知道是否得到空字符串,如果是原始字符串,则选择整数。
    【解决方案4】:

    我看到一个建议返回结构的答案。与整数和字符串值联合并将其作为返回类型怎么样

    【讨论】:

    【解决方案5】:

    你可以返回 void*,它会返回你想要的一切

    【讨论】:

    • brr,这是一个令人不寒而栗的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    相关资源
    最近更新 更多