C++17: 結構化繫結(Structured Bindings)

AbendEssen29發表於2024-03-29

遇到有時候寫函式需要返回多個值的情況。

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";
}

這個時候它的作用就體現出來了, 就是為了滿足讓你能把程式碼寫的足夠簡潔的需求的!

最後

如果多個返回值的組合是經常到處被用到, 可能還是結構體好些哈, 別學了新的就忘了舊的, 為了新而新就不好了

相關文章