验证码: 看不清楚,换一张 查询 注册会员,免验证
  • {{ basic.site_slogan }}
  • 打开微信扫一扫,
    您还可以在这里找到我们哟

    关注我们

C++中的结构化绑定类型怎么使用

阅读:784 来源:乙速云 作者:代码code

C++中的结构化绑定类型怎么使用

      C++20中新增了一个非常有用的特性

      结构化绑定(Structured Binding)。它可以让我们方便地从一个容器类型中取出元素并绑定到对应的变量中,使得代码更加简洁、易读。

      结构化绑定概念

      结构化绑定是C++20中的一个语言特性,允许将一个结构体或者其他类似类型的容器中的元素按照一定的顺序取出并且绑定到变量上,同时可以忽略不需要的元素。 使用结构化绑定可以使代码更加简洁易读,同时也提高了代码的可维护性。相对于C++11中引入的std::tie()方法,结构化绑定更加直观和方便。

      结构化绑定类型

      在C++20中,主要有三种类型可以使用结构化绑定:

      数组

      对于数组来说,结构化绑定返回一个std::tuple类型。

      int a[3] = {1, 2, 3}; 
      auto [x, y, z] = a; // x=1, y=2, z=3

      Pair

      对于std::pair类型,结构化绑定返回一个std::tuple类型。

      std::pair p = {1, 3.14}; 
      auto [a, b] = p; // a=1, b=3.14

      结构体

      对于自定义结构体类型,结构化绑定返回该结构体对应的各个成员。

      struct S { 
         int m1; 
         double m2; 
      }; 
      S s = {1, 3.14}; 
      auto [m1, m2] = s; // m1=1, m2=3.14

      实现一个可以被结构化绑定的类元组类型

      结构化绑定可以使代码更加简洁易读,同时也提高了代码的可维护性。我们可以自定义一个可以被结构化绑定的类元组类型。

      #include  
      #include  
      template  
      struct MyTuple { 
          std::tuple values; 
          template  
          MyTuple(Ts&&... args) : values(std::make_tuple(std::forward(args)...)) {} 
          template  
          auto& get() { 
             return std::get(values); 
          } 
      }; 
      template  
      auto make_mytuple(Args&&... args) { 
          return MyTuple(std::forward(args)...); 
      } 
      int main() { 
          auto mt = make_mytuple(1, 2.0, "hello"); 
          auto [a, b, c] = mt; 
          std::cout << a << ' ' << b << ' ' << c << std::endl; // 1 2 hello 
          mt.get<0>() = 100; 
          std::cout << mt.get<0>() << std::endl; // 100 
      }

      在上述代码中,我们自定义了一个MyTuple类,其成员变量是一个std::tuple类型。我们可以使用std::make_tuple()快速生成一个tuple,然后将其存储在MyTuple对象的values成员变量中。MyTuple还提供了一个get()成员模板函数,用来获取指定位置的元素。同时,我们还提供了一个工厂函数make_mytuple(),方便用户生成对象。

    分享到:
    *特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: hlamps#outlook.com (#换成@)。
    相关文章
    {{ v.title }}
    {{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
    你可能感兴趣
    推荐阅读 更多>