使用参数的模板语法

时间:2013-08-15 00:49:09

标签: c++ templates c++11 tuples

请注意以下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 个答案:

答案 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界面的一部分,在tuplearraypair之间是通用的。您可以将其作为用户概括为其他内容。

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模板参数。