如何让一个函数具有不同的返回类型? C ++

时间:2018-12-03 09:20:12

标签: c++ return-type

我正在做作业,教授将这项任务作为作业的一部分交给了我们。我对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
   }
}

5 个答案:

答案 0 :(得分:4)

这可以通过C ++ 17功能std::variantstd::get_if完成。

  • 搜索功能将返回std::variant<int, std::string>
  • main中,使用std::get_if确定已返回的值。

std::get_if返回指向存储在指向变量中的值的指针,或者在出现错误时返回null指针。

#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直播。

答案 1 :(得分:1)

您需要返回两个对象,并且无法通过重载该函数来完成此操作。

因此您可以使用:

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

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

答案 2 :(得分:1)

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

这里有2种可能的情况:

1返回同时包含整数和字符串并使用设置的结构的结构

E.G

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

returnData myFunc(std::string){}

2可能会将您的搜索字符串用作输入/输出参数,但这比赋值的意义更小,因此我不再赘述。

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

我真的不知道您的教授究竟期望从这个分配中得到什么,因为从字面上返回基于参数的不同值几乎是不可能的,除非您同时返回它们和忽略它们。

答案 3 :(得分:0)

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

答案 4 :(得分:-1)

您可以返回void *,它将返回您想要的所有内容