C++ std::tuple与模板元编程深度解析

需积分: 5 0 下载量 47 浏览量 更新于2024-06-21 收藏 2.94MB PDF 举报
藏经阁的《std__tuple与模板元编程.pdf》是一份关于C++标准库中的std::tuple及其在模板元编程中的应用教程。std::tuple是C++11中引入的一种容器,用于存储不同类型的数据,且支持固定大小的可变参数列表,类似于其他语言中的元组数据结构。这份文档涵盖了以下几个关键知识点: 1. **std::tuple基础**:介绍了如何声明和初始化tuple,如`tuple<int, double, string>`类型,以及如何通过索引访问元素(如`get<1>(t1)`)。例如,`tuple<int, double, string> t0;`定义了一个三元组,而`get<1>(t1)=0.2`展示了如何修改tuple内的元素。 2. **模板元编程**:文档可能涉及了模板元编程的概念,即在编译时处理模板,生成代码。这可能包括计算tuple的大小,如`tuple_size<decltype(t0)>::value`,这是一种在编译期获取tuple元素数量的方法。 3. **引用和const引用**:展示了如何使用`tuple<double&>`和`tuple<constdouble&>`来传递变量的引用,区分常量和非常量引用。例如,`tuple<double&> t2(d)`表示t2是一个引用tuple,可以直接修改d的值。 4. **make_tuple和auto**:讲解了`make_tuple`函数用于创建tuple,以及`auto`关键字在模板元编程中的作用,如`auto t1 = make_tuple(c,d);`自动推导了tuple的类型,简化了代码。 5. **const tuple和引用传递**:讨论了如何使用`consttuple<int, double>&`来创建常量引用,并通过`make_tuple(cref(a))`和`make_tuple(cref(ca))`展示了不同类型的引用构造。 这份文档不仅介绍了std::tuple的基本用法,还可能涉及了高级特性,如利用模板元编程技术增强tuple的灵活性和性能。对于学习C++编程特别是模板和元编程的开发者来说,这是一份实用的参考资料。阅读时,读者可以深入理解C++中的动态类型创建、类型推导以及模板元编程在实际项目中的应用场景。

In file included from /home/yhdr/2-test-2023-06_v3/sent.h:24:0, from /home/yhdr/2-test-2023-06_v3/sent.cpp:1: /usr/include/c++/7/thread: In instantiation of ‘struct std::thread::_Invoker<std::tuple<void (*)(double*, double&, double&, double&, double&, double&), double**, std::reference_wrapper<double>, std::reference_wrapper<double>, std::reference_wrapper<double>, std::reference_wrapper<double>, std::reference_wrapper<double> > >’: /usr/include/c++/7/thread:127:22: required from ‘std::thread::thread(_Callable&&, _Args&& ...) [with _Callable = void (&)(double*, double&, double&, double&, double&, double&); _Args = {double**, std::reference_wrapper<double>, std::reference_wrapper<double>, std::reference_wrapper<double>, std::reference_wrapper<double>, std::reference_wrapper<double>}]’ /home/yhdr/2-test-2023-06_v3/sent.cpp:18:153: required from here /usr/include/c++/7/thread:240:2: error: no matching function for call to ‘std::thread::_Invoker<std::tuple<void (*)(double*, double&, double&, double&, double&, double&), double**, std::reference_wrapper<double>, std::reference_wrapper<double>, std::reference_wrapper<double>, std::reference_wrapper<double>, std::reference_wrapper<double> > >::_M_invoke(std::thread::_Invoker<std::tuple<void (*)(double*, double&, double&, double&, double&, double&), double**, std::reference_wrapper<double>, std::reference_wrapper<double>, std::reference_wrapper<double>, std::reference_wrapper<double>, std::reference_wrapper<double> > >::_Indices)’ operator()() ^~~~~~~~ /usr/include/c++/7/thread:231:4: note: candidate: template<long unsigned int ..._Ind> decltype (std::__invoke((_S_declval<_Ind>)()...)) std::thread::_Invoker<_Tuple>::_M_invoke(std::_Index_tuple<_Ind ...>) [with long unsigned int ..._Ind = {_Ind ...}; _Tuple = std::tuple<void (*)(double*, double&, double&, double&, double&, double&), double**, std::reference_wrapper<double>, std::reference_wrapper<double>, std::reference_wrapper<double>, std::reference_wrapper<double>, std::reference_wrapper<double> >] _M_invoke(_Index_tuple<_Ind...>)

2023-06-07 上传