请注意以下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
如何工作的简单示例。
答案 0 :(得分:4)
您可以像在其他任何地方一样将参数作为参数传递给模板参数,您可能熟悉将类型作为参数传递,如下所示:
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
因此,您传递的是指定类型的编译时值,而不是传递类型。
答案 1 :(得分:0)
是的,您将2
作为模板参数传递给get
方法。这就是std::get
原型的方式:
template <std::size_t l, class... Types> /* ... */ get(std::tuple<Types...>& t);
使用模板参数推导,这就是为什么只给出模板参数l
。
答案 2 :(得分:0)
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>
中的std::vector<int>
一样,但它是一个值而不是一个类型。模板允许这样做;它们被称为非类型参数,并且与更常见的类型参数平等存在。 (虽然只允许明确的,准确的值,因此对非类型参数的类型有一定的限制。)
请注意,模板在编译时处理,因此模板参数必须是编译时常量。至少在C ++ 11中,这不会飞。
int fortytwo = std::get< std::get< 3 >( blah ) >( blah );
(尽管可以编写支持这种事情的自定义函数,只要结构的内容是常量,使用constexpr
特性。而C ++ 14将被定为{{1} },所以这会奏效。)
答案 3 :(得分:0)
是的,模板参数不一定是类型。有几种不同类型的非类型模板参数。他们可以是以下任何一个:
在这种情况下,std::get
有一个size_t
模板参数。