请注意std::get
下面的函数语法:
std::tuple <int, double, long &, const char *> bar(18, 6.5, 12, "Hello!");
cout << std::get<2>(bar); // Print the tuple’s third element.
我不熟悉这种语法......
这是使用模板语法来传递参数吗?
如果是,请提供一个简单的例子来说明如何std::get
工作。
您可以像其他任何东西一样在模板参数中将内容作为参数传递,您可能熟悉将类型作为参数传递,如下所示:
template<typename T>
void f() {}
并像这样调用函数:f<int>()
.
这是相同的概念,只是它被扩展为具体类型。
例子:
#include <iostream>
template<size_t N>
void f() {
std::cout << N << '\n';
}
int main() {
f<10>();
f<11>();
f<100>();
}
输出:
10
11
100
因此,不是传递type,而是传递指定类型的编译时值。
std::get
是用于从某种序列中获取项目的通用函数模板。
它是接口的一部分,在、和std::tuple
之间是通用的。作为用户,您可以将其推广到其他事物。tuple
array
pair
std::array< int, 5 > blah {{ 2, 42, 9, 1, 3 }};
int fortytwo = std::get< 1 >( blah );
序列索引<2>
是一个模板参数,就像<int>
in一样std::vector<int>
,但它是一个值而不是一个类型。模板允许这样做;它们被称为非类型参数,与更常见的类型参数处于同等地位。(但只允许使用明确的、精确的值,因此对非类型参数的类型有一定的限制。)
请注意,模板是在编译时处理的,因此模板参数必须是编译时常量。这不会飞,至少在 C++11 中是这样。
int fortytwo = std::get< std::get< 3 >( blah ) >( blah );
(虽然可以编写支持这种东西的自定义函数,只要结构的内容是常量,使用这个constexpr
特性。而且 C++14 预定有constexpr get
,所以这会起作用。)
是的,您将2
作为模板参数传递给该get
方法。这std::get
是原型的方式:
template <std::size_t l, class... Types> /* ... */ get(std::tuple<Types...>& t);
使用了模板参数推导,这就是为什么l
只给出模板参数的原因。
是的,模板参数不必是类型。有几种不同类型的非类型模板参数。它们可以是以下任何一种:
在这种情况下,std::get
有一个size_t
模板参数。