- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章C++11新特性std::tuple的使用方法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
1. 引入头文件 。
1
|
#include <tuple>
|
2. std::tuple初始化 。
1
|
std::tuple<
int
, std::string,
float
> t1(10,
"Test"
, 3.14);
|
这里要注意,不是所有的C++ 11编译器都支持copy-list-initialization的方式。如下代码所示.
1
2
3
4
5
6
|
std::tuple<
int
,
int
> foo_tuple()
{
return
{1, -1};
// Error until N4387
return
std::tuple<
int
,
int
>{1, -1};
// Always works
return
std::make_tuple(1, -1);
// Always works
}
|
3. 打印std::tuple 。
打印std::tuple可以将它的元素逐个打印出来,不过非常繁琐,我们可以通过如下通用的打印函数,帮助我们一次性的将tuple的所有要素打印出来.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
#include <iostream>
#include <tuple>
#include <string>
// helper function to print a tuple of any size
template
<
class
Tuple, std::
size_t
N>
struct
TuplePrinter {
static
void
print(
const
Tuple& t)
{
TuplePrinter<Tuple, N-1>::print(t);
std::cout <<
", "
<< std::get<N-1>(t);
}
};
template
<
class
Tuple>
struct
TuplePrinter<Tuple, 1> {
static
void
print(
const
Tuple& t)
{
std::cout << std::get<0>(t);
}
};
template
<
typename
... Args, std::enable_if_t<
sizeof
...(Args) == 0,
int
> = 0>
void
print(
const
std::tuple<Args...>& t)
{
std::cout <<
"()\n"
;
}
template
<
typename
... Args, std::enable_if_t<
sizeof
...(Args) != 0,
int
> = 0>
void
print(
const
std::tuple<Args...>& t)
{
std::cout <<
"("
;
TuplePrinter<decltype(t),
sizeof
...(Args)>::print(t);
std::cout <<
")\n"
;
}
// end helper function
int
main()
{
std::tuple<
int
, std::string,
float
> t1(10,
"Test"
, 3.14);
print(t1);
}
|
输出:
(10, Test, 3.14) 。
4、合并多个std::tuple 。
std::tuple_cat函数可以将多个std::tuple合并为一个tuple.
1
2
3
4
5
6
7
8
|
int
main()
{
std::tuple<
int
, std::string,
float
> t1(10,
"Test"
, 3.14);
int
n = 7;
auto t2 = std::tuple_cat(t1, std::make_tuple(
"Foo"
,
"bar"
), t1, std::tie(n));
n = 42;
print(t2);
}
|
输出:
(10, Test, 3.14, Foo, bar, 10, Test, 3.14, 42) 。
5. std::tuple的解包(unpack) 。
std::tie能够将std::tuple包含的要素解包(unpack)成单个的对象.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#include <iostream>
#include <tuple>
#include <string>
int
main() {
auto info = std::make_tuple(3.8,
'A'
,
"Lisa Simpson"
);
double
score = 0.0;
char
grade;
std::string name;
std::tie(score, grade, name) = info;
std::cout <<
"score:"
<< score <<
", grade:"
<< grade <<
", name:"
<< name << std::endl;
return
0;
}
|
输出
score:3.8, grade:A, name:Lisa Simpson 。
std::tie还支持std::pair对象的解包(unpack).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#include <iostream>
#include <tuple>
#include <string>
#include <utility>
int
main() {
auto info = std::make_pair(3.8,
"Lisa Simpson"
);
double
score = 0.0;
std::string name;
std::tie(score, name) = info;
std::cout <<
"score:"
<< score <<
", name:"
<< name << std::endl;
return
0;
}
|
输出
score:3.8, name:Lisa Simpson 。
当我们不关注tuple中的某个元素时,可以使用std::ignore忽略该元素.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#include <iostream>
#include <tuple>
#include <string>
#include <utility>
int
main() {
auto info = std::make_pair(3.8,
"Lisa Simpson"
);
double
score = 0.0;
std::string name;
std::tie(score, std::ignore) = info;
std::cout <<
"score:"
<< score <<
", name:"
<< name << std::endl;
return
0;
}
|
输出
score:3.8, name
参考材料 。
https://en.cppreference.com/w/cpp/utility/tuple/tuple_cat 。
到此这篇关于C++11新特性-std::tuple的使用方法的文章就介绍到这了,更多相关C++11 std::tuple内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:http://www.banbeichadexiaojiubei.com/index.php/2020/10/05/c11%E6%96%B0%E7%89%B9%E6%80%A7-stdtuple/ 。
最后此篇关于C++11新特性std::tuple的使用方法的文章就讲到这里了,如果你想了解更多关于C++11新特性std::tuple的使用方法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在开发一个小型图书馆,我需要做的一件事是让访问者访问一些数据并返回结果。 在一些较旧的 C++ 代码中,访问者需要声明一个 typedef return_type .例如,boost::stati
我正在尝试使用std:map类型的键和值制作std::any Visual Studio 2017 std::map m("lastname", "Ivanov"); std::cout (m["la
我已经在 C++ 的 map 中声明了一个集合为 std::map> .如何循环访问或打印设定值? 最佳答案 如果你知道如何迭代 std::map或 std::set单独地,您应该可以毫无问题地组合迭
如何循环? 我已经试过了: //----- code std::vector >::iterator it; for ( it = users.begin(); it != users.end();
我有两个用例。 A.我想同步访问两个线程的队列。 B.我想同步两个线程对队列的访问并使用条件变量,因为其中一个线程将等待另一个线程将内容存储到队列中。 对于用例 A,我看到了使用 std::lock_
我正在查看这两种类型特征的文档,但不确定有什么区别。我不是语言律师,但据我所知,它们都适用于“memcpy-able”类型。 它们可以互换使用吗? 最佳答案 不,这些术语不能互换使用。这两个术语都表示
我有以下测试代码,其中有一个参数 fS,它是 ofstream 的容器: #include #include #include #include int
这是这个问题的延续 c++ function ptr in unorderer_map, compile time error 我试图使用 std::function 而不是函数指针,并且只有当函数是
std::unordered_map str_bool_map = { {"a", true}, {"b", false}, {"c", true} }; 我们可以在此映射上使
我有以下对象 std::vector> vectorList; 然后我添加到这个使用 std::vector vec_tmp; vec_tmp.push_back(strDRG); vec_tmp.p
为什么 std::initializer_list不支持std::get<> , std::tuple_size和 std::tuple_element ?在constexpr中用得很多现在的表达式,
我有一个像这样定义的变量 auto drum = std::make_tuple ( std::make_tuple ( 0.3f , Ex
假设我有一个私有(private)std::map在我的类(class)里std::map 。我怎样才能将其转换为std::map返回给用户?我想要下面的原型(prototype) const std
假设我有一个私有(private)std::map在我的类(class)里std::map 。我怎样才能将其转换为std::map返回给用户?我想要下面的原型(prototype) const std
问题 我正在尝试将 lambda 闭包传递给 std::thread,它使用任意封闭参数调用任意封闭函数。 template std::thread timed_thread(Function&& f
我想创建一个模板类,可以容纳容器和容器的任意组合。例如,std::vector或 std::map ,例如。 我尝试了很多组合,但我必须承认模板的复杂性让我不知所措。我编译的关闭是这样的: templ
我有一个 std::vector>我将其分配给相同类型的第二个 vector 。 我收到这个编译器错误: /opt/gcc-8.2.0/include/c++/8.2.0/bits/stl_algob
有时候,我们有一个工厂可以生成一个 std::unique_ptr vector ,后来我们想在类/线程/你命名的之间共享这些指针。因此,最好改用 std::shared_ptr 。当然有一种方法可以
这个问题在这里已经有了答案: Sorting a vector of custom objects (14 个答案) 关闭 6 年前。 我创建了一个 vector vector ,我想根据我定义的参
我有三个类(class)成员: public: std::vector > getObjects(); std::vector > getObjects() const; privat
我是一名优秀的程序员,十分优秀!