Structured Binding 是 C++17 納入的新功能,目前主流的編譯器都支援了這個功能。
以往麻煩的寫法,Structured Binding 搭配 auto
關鍵字,讓 C++ 程式碼更加精簡,也導出新的設計手法。以下示例:
struct TeaShopOwner {
int id;
std::string name;
};
auto GetTeaShopOwner() -> TeaShopOwner
{
TeaShopOwner owner { 87, "1Shit"};
return owner;
}
auto [id, name] = GetTeaShopOwner();
留意上述程式碼最後一行,GetTeaShopOwner()
的回傳值為 TeaShopOwner
struct,透過 Structured Binding 其回傳值改為兩個相應型別的變數。如此寫法,在許多場合讓程式碼更精簡,而且語義更加明確。
另一個更能突顯 Structured Binding 好處是搭配 Ranged-based for Loop:
struct TeaShopOwner {
int id;
std::string name;
};
std::vector<TeaShopOwner> owners {{1, "COCO"}, {2, "1Shit"}};
// OLD
for (const auto& owner : owners) {
printf("Owner id = %d\n", owner.id);
}
// Using Structured Binding
for (const auto& [id, _] : owners) {
printf("Owner id = %d\n", id);
}
留意上面的 Ranged-based for-loop 接住 owners
時,將第二個變數名稱取為 _
,利用這個手法來表示 name
在迴圈裡不受「重視」。
以往 C++ 函數的回傳值多是單一型別,如 bool, int。有了 Structured Binding 再搭配其他技巧,在處理回傳值時更有彈性。