0

请注意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工作。

4

4 回答 4

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

因此,不是传递type,而是传递指定类型的编译时值。

于 2013-08-15T00:54:34.727 回答
0

std::get是用于从某种序列中获取项目的通用函数模板。

它是接口的一部分,在、和std::tuple之间是通用的。作为用户,您可以将其推广到其他事物。tuplearraypair

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,所以这会起作用。)

于 2013-08-15T00:56:13.637 回答
0

是的,您将2作为模板参数传递给该get方法。这std::get是原型的方式:

template <std::size_t l, class... Types>
/* ... */ get(std::tuple<Types...>& t);

使用了模板参数推导,这就是为什么l只给出模板参数的原因。

于 2013-08-15T00:54:25.300 回答
0

是的,模板参数不必是类型。有几种不同类型的非类型模板参数。它们可以是以下任何一种:

  • 整数或枚举类型
  • 指向对象的指针或指向函数的指针
  • 引用对象或引用函数
  • 指向成员的指针

在这种情况下,std::get有一个size_t模板参数。

于 2013-08-15T01:01:27.803 回答