使用本地struct时重用C++结构化绑定变量的方法
解决方案
直接使用[i, name] = foo(20);这种语法在当前C++标准中是不支持的,但你可以通过以下几种方式实现变量重用的需求,同时保留struct的可读性(或切换到tuple):
一、保留struct的方案
方案1:将struct提升为外部类型,通过绑定引用实现自动更新
把函数内部的struct s移到全局或命名空间作用域,然后定义一个该类型的变量,再用结构化绑定绑定到它的成员引用,后续直接更新结构体变量即可:
#include <string> // 将struct移到外部,让外部代码可以直接使用 struct s { int i; std::string name; }; auto foo(int i) { return s{i+10, "hello there"}; } int main() { // 定义结构体变量并初始化 s my_data = foo(10); // 绑定到成员的引用 auto& [i, name] = my_data; // 此时i=20,name="hello there" // 后续更新结构体 my_data = foo(20); // i和name会自动变为30和"hello there" return 0; }
方案2:为struct添加tuple-like支持,使用std::tie
通过特化std::tuple_size、std::tuple_element并实现get函数,让你的struct能被std::tie识别,这样就可以像tuple一样重用变量:
#include <string> #include <tuple> struct s { int i; std::string name; }; // 特化tuple相关模板,让struct具备tuple特性 namespace std { template<> struct tuple_size<s> : std::integral_constant<std::size_t, 2> {}; template<> struct tuple_element<0, s> { using type = int; }; template<> struct tuple_element<1, s> { using type = std::string; }; } // 实现get函数,用于访问struct的成员 template<std::size_t N> auto& get(s& obj) { if constexpr (N == 0) return obj.i; else if constexpr (N == 1) return obj.name; } template<std::size_t N> const auto& get(const s& obj) { if constexpr (N == 0) return obj.i; else if constexpr (N == 1) return obj.name; } auto foo(int i) { return s{i+10, "hello there"}; } int main() { int i; std::string name; // 第一次赋值 std::tie(i, name) = foo(10); // 后续重用变量赋值 std::tie(i, name) = foo(20); return 0; }
二、切换为tuple的方案
如果可以接受用tuple替代struct,实现会更简洁:
#include <string> #include <tuple> auto foo(int i) { return std::make_tuple(i+10, std::string("hello there")); } int main() { // 方法1:用std::tie直接重用变量 int i; std::string name; std::tie(i, name) = foo(10); std::tie(i, name) = foo(20); // 方法2:绑定到tuple的引用,更新tuple自动同步变量 auto my_tuple = foo(10); auto& [i_ref, name_ref] = my_tuple; my_tuple = foo(20); return 0; }
内容的提问来源于stack exchange,提问作者Plasty Grove
相关产品推荐
相关产品推荐

