C++ 有人能解释boost元组库的语法吗?

C++ 有人能解释boost元组库的语法吗?,c++,boost,C++,Boost,当我使用Boost.Tuple时,我必须使用一些语法,如: result.get<0>() result.get() 我觉得它很陌生。通常包含类型名,为什么在这里使用int?介于之间的内容可以是类型。它也可以是整数。事实上,这可能是很多事情。模板参数可以是类型名,但也可以是编译时常量值 这声明了一个采用以下类型的模板函数: template<typename T> void foo(); 模板void foo(); 此参数采用编译时整数: template<

当我使用
Boost.Tuple
时,我必须使用一些语法,如:

result.get<0>()
result.get()
我觉得它很陌生。通常
包含类型名,为什么在这里使用
int

介于
之间的内容可以是类型。它也可以是整数。事实上,这可能是很多事情。模板参数可以是类型名,但也可以是编译时常量值

这声明了一个采用以下类型的模板函数:

template<typename T> void foo();
模板void foo();
此参数采用编译时整数:

template<int I> void foo();
模板void foo();
介于
之间的内容可以是类型。它也可以是整数。事实上,这可能是很多事情。模板参数可以是类型名,但也可以是编译时常量值

这声明了一个采用以下类型的模板函数:

template<typename T> void foo();
模板void foo();
此参数采用编译时整数:

template<int I> void foo();
模板void foo();

< /代码> 使用语法>代码>结果.GET()//CUT>的原因是元组的每个元素都可以有不同的类型,这种语法是C++中最简单的方式,允许编译器对类型进行正确的处理。p> 如果函数只是普通的
get(0)
,那么元组的所有元素都必须具有相同的类型,因为不可能有一个未经模板化的
get
函数返回多个不同的类型


类似于
result.get(0)
的东西在理论上可以工作,但它更详细,并且引入了潜在的错误源——如果第0个元素根本不是
int
?更糟糕的是,您只能在运行时捕获此错误。Boost中使用的语法简单明了——唯一可能弄糟它的方法是指定一个无效的索引,该索引可以在编译时捕获。

他们使用语法
result.get()
的原因是元组的每个元素都可以有不同的类型,这个语法是C++中最简单的方法,让编译器用类型做正确的事情。p> 如果函数只是普通的
get(0)
,那么元组的所有元素都必须具有相同的类型,因为不可能有一个未经模板化的
get
函数返回多个不同的类型


类似于
result.get(0)
的东西在理论上可以工作,但它更详细,并且引入了潜在的错误源——如果第0个元素根本不是
int
?更糟糕的是,您只能在运行时捕获此错误。Boost中使用的语法简单明了——唯一可能弄糟它的方法是指定一个无效的索引,这可以在编译时捕获。

如果您熟悉模板元编程(TMP),这是一个相当熟悉的语法。但是如果您不想陷入编译时编程的魔咒,那么您应该担心的是模板参数是元组的索引

如果您熟悉模板元编程(TMP),这是一种相当熟悉的语法。但是如果你不想进入编译时编程的黑魔幻,那么你应该担心的是模板参数是使用元组作为模板参数的元组

中的索引,在C++中是完全有效的。它和它看起来一样复杂。为什么不使用类似于result.get(1)的东西呢?您实际上应该使用免费函数
get(result)
,因为并非所有编译器都支持成员函数(可能没有正确地实现模板以使其成为可能)使用整数作为模板参数在C++中是完全有效的。它使用int来给出一个数字…它和看起来一样复杂。为什么不使用类似于result.get(1)的功能呢?实际上,您应该使用免费函数
get(result)
,因为并非所有编译器都支持成员函数(可能没有正确地实现模板以使其成为可能)。