(我正在使用Visual C +++ 2010) 假设我已经定义了这样的元组:
typedef std::tr1::tuple<
int //i want to set its default value to 9
, double //i want to set its default value to 3.3
, int //i want to set its default value to 2
, double //i want to set its default value to -7.2
> Mytuple;
我可以在结构中做到这一点。但我想知道是否有可能在std::tr1::tuple
中这样做
此外,我想知道什么时候使用std::tr1:tuple
或struct?
任何人都可以帮助我吗?
答案 0 :(得分:5)
tuple
不是结构的神奇替代品。他们的目的非常不同。结构首先是语言结构。 tuple
是库构造。
结构得到默认值,因为语言表示你可以编写构造函数来赋予它们默认值。然后,语言负责调用该构造函数来初始化结构。 tuple
作为库构造,没有这样的功能,只能为std::vector<T>
提供一个始终自动使用的默认T
。您可以为每个成员提供初始值,但不能为其提供默认值。
如果你考虑一下,你不会想要。想象一下,如果有人可以说每个tuple<int, float>
总是创建了3和54.221。即使其他一些代码创建它对该规则一无所知,也必须遵循它(就像该类型的构造函数在所使用的类型的任何地方都使用一样)。请记住:每个tuple<int, float>
都是相同的类型。
实际上,tuple
可以替代无法对结构执行反射并对其成员进行编译时迭代。它们存在的另一个主要原因是能够具有编译时动态结构(即,能够基于编译时参数创建类型的聚合,而不是直接写入文件的静态列表)。
因此,除非你需要使用std::tie
(为了有效地返回多个值),迭代成员(即:为对象的每个成员调用一些模板函数),或者一些类似的专用代码,你应该使用结构。