C11简洁之道:tupe元祖

  tuple元组是一个固定大小不同类型的值的集合,是泛化的std::pair。我们也可以把它当作一个通用的结构体来使用,不需要创建结构体有获取结构体特征,在某些情况可以取代结构体,使程序更简洁、直观。

  tuple在C++11中使用简单,但是往往要和模板元的一些技巧结合使用。

tuple<const char *, int> tp = make_tuple("hello", 5); //构造一个tuple

  这个tuple等同于结构体:

struct A
{
    char *p;
    int len;
};

  另外一种方法也可以创建元组:std::tie,它会创建一个元组的左值引用。

auto tp = return std::tie(1, "aa", 3); //tp的实际类型是std::tuple<int &, string &, int &>

  再看如何取值:

const char *data = tp.get<0>();
int len = tp.get<1>();

  还有std::tie也可以解包tuple来获取元组的值:

int x, y;
string s;
std::tie(x, s, y) = tp;

  通过tie解包之后,tp的三个元素会自动赋值给三个变量,如果只想解某个位置的值,可以使用std::ignore占位符来表示忽略某个位置的值。

std::tie(std::ignore, std::ignore, y) = tp; //只解第三个值

  如果要创建右值引用的元组,可以使用foward_as_tuple。

std::map<int, std::string> map; 

//创建一个类似std::tuple<int &&, std::string &&>的tuple
map.emplace(std::foward_as_tuple(10, std::string(20, 'a')));

  还可以通过tuple_cat来连接多个tuple:

std::tuple<int, std::string, float> t1(10, "test", 30.21);

int n = 7;
auto t2 = std::tuple_cat(t1, std::make_pair("foo", "bar"), t1, std::tie(n));

n = 10;

  打印t2的值:

10, test, 30.21,foo, bar, 10, test, 30.21, 10

  tuple虽然可以替代简单的结构体,但是如果三个以上字段的结构体会导致可读性降低,到处都是std::get<N>(tuple),导致代码混乱,可维护性和可读性很低。

原文链接: https://www.cnblogs.com/ChinaHook/p/7658466.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    C11简洁之道:tupe元祖

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/399417

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年4月13日 上午9:22
下一篇 2023年4月13日 上午9:23

相关推荐