C++ 如何使函数具有不同的返回类型?C++;

C++ 如何使函数具有不同的返回类型?C++;,c++,return-type,C++,Return Type,我正在做一项作业,我的教授给了我们这个任务作为作业的一部分。我还是比较新的C++,所以有任何帮助。我创建了这个函数,但是我不明白如果什么都没有找到,他是如何想返回一个空字符串的,如果找到了,他想返回一个整数。在没有重载函数的情况下,这是可能的吗?现在我只是将函数设置为整数类型,而不是返回空字符串,而是返回0 这是任务的一部分。如果你能解释你的解决方案,让像我这样的哑巴能够理解,我将不胜感激 FindWord–此成员函数将字符串作为参数,并在 列表如果列表为空或找不到,则返回空字符串值(“”)。否

我正在做一项作业,我的教授给了我们这个任务作为作业的一部分。我还是比较新的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
   }
}
int-WordList::FindWord(字符串字){
if((listSize=0)){//如果不存在列表,则返回-1;
返回-1;
}
否则{

对于(inti=0;i,您需要返回两个对象,并且不能通过重载函数来实现这一点

因此,您可以使用:

std::pair<int, std::string> search(const std::string&, const std::list<std::string>& l);
std::pair search(const std::string&,const std::list&l);
也可以通过传递对第二个对象的引用来返回该对象:

std::string search(const std::string&, const std::list<std::string>& l, it& index);
std::string搜索(const std::string&,const std::list&l,it&index);
C++17中的另一个选项是正确的方法:

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

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

< p>这是C++中不可能的,只有一个返回类型可以为函数定义。

这里有两种可能的情况:

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

2可能会使用您的搜索字符串作为输入/输出参数,但这比赋值更有意义,因此我不会深入讨论

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


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

这可以通过C++17特性
std::variant
std::get\u if
来实现

  • 搜索功能将返回
    std::variant
  • 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';    

}
#包括
#包括
#包括
#包括
std::variant strearch(const std::string和searchStr,const std::list和searchList)
{
int i=0;
对于(const auto&s:searchList){
如果(!s.find(searchStr))
返回i;
i++;
}
返回“”;
}
int main()
{
std::list strList={“stack”、“stackover”、“stackoverflow”};
std::string str=“stackoverflow”;
std::变异体v{strSearch(str,strList)};
if(std::get_if(&v))

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

我看到一个答案,建议返回结构。使用整型值和字符串值并集并将其作为返回类型如何

这是一个非常糟糕的赋值…返回-1或
npos
,好的,但是一个空字符串?欢迎使用堆栈溢出。请阅读,获取,同时阅读。最后学习如何创建。不,这是不可能的。要么你误解了要求你做的事情,要么你的老师是个白痴。我建议你问你的老师,看不出这样做有什么帮助。你可以查看
std::variant
,尽管我同意上面的评论,这项作业对于C++教学来说,这不是最好的,因为它是令人困惑的。我建议返回一个无效的位置,比如-1,用于表示字符串没有被发现。在C++中,每个函数都有签名类型的参数和返回值的类型,所以不能在一个字符串中返回一个字符串,而在另一个字符串中返回int。:any.您正在做的是(或者看起来很像)std::find,这样您就可以检查它是如何工作的(我想,如果您遵循标准库的“样式”,大多数人会发现阅读代码更容易)似乎不太可能是问题所要求的。您如何判断这两个返回值中哪一个适用?很简单。字符串的返回值可能是您传入的字符串,因此您知道是否得到空字符串,如果是原始字符串,则选择整数。如果是C++17,则选择可选的,而不是返回值MatthuuruChuri:这里的问题是老师的人工需求。在这些约束下,这是最好的答案。但是我打赌老师没有预料到这个答案。问题的措辞告诉我们老师实际上并不熟悉C++。我知道问题的质量,请看我的评论。问题。@sircoop:这回答了你的问题吗?brr,这是一个令人毛骨悚然的选择。打电话的人怎么知道工会中的哪个项目已经填写了?这是一个有效的问题。我在这里找到了一些答案
#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';    

}