在C++函数中返回两个不同类型的值

3
我正在编写一个程序,对用户输入的字符串进行简单的旋转(类似于rot13)。我的问题是,我想每次改变字符串中每个字符的ASCII值时都用不同的数量 - 所以我使用for循环遍历字符串,并调用一个生成随机数的函数。但是,我希望能够返回这个数字,以便我可以在以后的日期“解密”该字符串。当然,我也需要返回字符串。
以下是我的代码:
int ranFunction()
{

    int number = rand() % 31;
    return number;

}

string rotFunction(string words)
{
    int upper_A = 65;
    int lower_z = 122;
    int rand_int = 0;

    for (int i = 0; i < words.length(); i++)
    {
        rand_int = ranFunction();

        if (words[i] >= upper_A && words[i] <= lower_z) {

            words[i] -= rand_int;


        }

    }
    return words; 
}

我希望rotFunction能够根据每次rand_int的不同返回单词和整数。请注意:我目前使用的关于ascii值等的数字完全是任意的,只是为了测试。

1
这个网页可能对你有兴趣:http://stackoverflow.com/documentation/c%2b%2b/487/returning-several-values-from-a-function#t=201701261136058675108 - W.F.
1
为什么不返回一个结构体。 - marshal craft
1
@Arco3 首先,这个语句 rand_int = ranFunction(); 应该放在循环外面吗? - Vlad from Moscow
2个回答

6

要返回两种不同类型的值,请使用 std::pair

std::pair<T1,T2> foo(){
    return std::make_pair(v1,v2);
}

例子:

std::pair<int,float> foo(){
    return std::make_pair(5,0.5f);
}

如果要返回两种以上不同类型的值,可以使用 std::tuple

std::tuple<T1,T2,...,Tn> foo(){
    return std::make_pair(v1,v2,...,Tn);
}

例子:

std::tuple<int,float,std::string> foo(){
    return std::make_tuple(5,0.5f,"sss");
}

4
一个简单的方法是返回一个structclass类型。
 struct rotReturn
 {
      int ran;
      std::string str;
 };

 rotReturn rotFunction(std::string words)
 {
     // what you have, except for the return
     rotReturn retval
     retval.ran = rand_int;
     retval.str = words;
     return retval;
 }

显然,可以优化并使用结构来返回函数内部的结果,而不是使用单独的变量来存储中间结果。

备选方案包括返回一个 std::pair<int, std::string> 或者(如果需要绑定更多值)一个 std::tuple。这两种类型都是专门的 structclass 类型。

还可以通过引用或指针(地址)将这些类型传递给函数,以便调用者可以传递一个对象,使函数将数据存储到其中。


谢谢,这就是我最终做的。 - Arco3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接