遇到有時候寫函式需要返回多個值的情況。
C++17之前,只能事先定義一個結構體, 然後返回這個結構體型別就可以了。
但是如果你的這個結構體型別只在這個這裡用一次呢。
你還要摳腦殼想一個合適的結構體名字,麻煩!
std::tuple
C++11引入了一個新的類别範本叫std::tuple,
是一個容器, 可以儲存多個不同型別的值。
#include <iostream>
#include <string>
#include <tuple>
// 只需填型別, 不用像定義結構體那樣需要命名成員變數
// BTW, 這種兩個成員的其實也可以用std::pair, 但是不具備一般性
// 如果哪天要增加成員, 還得改變型別成tuple
// 直接寫tuple, 一勞永逸, 可變性也要好些, 方便改動
std::tuple<std::string, int> CreatePerson()
{
return { "小島秀夫賽高", 56 };
}
int main()
{
auto person = CreatePerson();
// 透過工具函式get訪問uple各元素, 下標 0 代表tuple得第一個元素, 依次得到對應元素.
std::string &name = std::get<0>(person);
int age = std::get<1>(person);
std::cout << name << " " << age << "\n";
}
但是,這樣做華而不實 —— 雖然不用事先定義結構體了,看似簡潔了。
但是啊,這個get函式長得也太奇怪了,直白點就是好醜啊,0 1 2這種下標看著就夠噁心的了。
先用tie改進一下
std::tuple<std::string, int> CreatePerson()
{
return { "小島秀夫賽高", 56 };
}
int main()
{
std::string name;
int age;
// 依次繫結tuple中的元素到對應變數, 給get 0 1 2 3 說拜拜了
std::tie(name, age) = CreatePerson();
std::cout << name << " " << age << "\n";
}
的確比之前簡潔許多了。
但是啊,還是要用三行程式碼啊。
我之前用結構體型別的變數person,透過 '.' 成員訪問運算子訪問比這個使用起來簡潔多了。
結構化繫結
std::tuple<std::string, int> CreatePerson()
{
return { "小島秀夫賽高", 56 };
}
int main()
{
// 不用多說了把 形如這樣auto然後方括號裡面依次寫對應的變數名
// 自行體會其中的妙處 嘿嘿嘿
auto[name, age] = CreatePerson();
std::cout << name << " " << age << "\n";
}
這個時候它的作用就體現出來了, 就是為了滿足讓你能把程式碼寫的足夠簡潔的需求的!
最後
如果多個返回值的組合是經常到處被用到, 可能還是結構體好些哈, 別學了新的就忘了舊的, 為了新而新就不好了