C++17 の構造化束縛を range-based for で使う

  • 10
    Like
  • 0
    Comment

ブログ記事からの転載です。

C++17 では構造化束縛という言語機能が追加されました。

これは std::tie のように std::tuple などを個別に変数で受け取る事が出来る機能です。

auto homu = std::make_tuple(1, "homu", 14);

// std::tuple の要素を個別に受け取る
auto [id, name, age] = homu;

std::tie とは違い変数定義で使用する事が出来ます。

range-based for で使う

これだけでも便利なのですが、range-based for と組み合わせることで更に便利になります。

#include <tuple>
#include <vector>
#include <string>
#include <iostream>

int
main(){
    std::vector<std::tuple<int, std::string, int>> vc = {
        { 1, "homu", 14 },
        { 2, "mami", 15 },
        { 3, "mado", 14 }
    };
    for(auto&& [id, name, age] : vc){
        std::cout << "id:" << id << ", name:" << name << ", age:" << age << std::endl;
    }

    return 0;
}
/*
output:
id:1, name:homu, age:14
id:2, name:mami, age:15
id:3, name:mado, age:14
*/

https://wandbox.org/permlink/HwbLhRyBDCdQDsT8

こんな感じに range-based for の変数定義でも構造化束縛を使うことが出来ます。

ますます std::tuple が便利になりますね。