std :: tuple get()成员函数

boost::tuple有一个get()成员函数,像这样使用:

 tuple<int, string, string> t(5, "foo", "bar"); cout << t.get<1>(); // outputs "foo" 

看来C ++ 0x std::tuple没有这个成员函数,你必须使用非成员函数的forms:

 std::get<1>(t); 

这对我来说看起来很丑。

为什么std::tuple没有成员函数有什么特别的理由? 还是只是我的实现(GCC 4.4)?

从C ++ 0x草案:

[注意:get是一个非成员函数的原因是,如果这个function是作为一个成员函数提供的,那么types依赖于模板参数的代码将需要使用template关键字。 – 结束注意]

这可以用这个代码来说明:

 template <typename T> struct test { T value; template <int ignored> T& member_get () { return value; } }; template <int ignored, typename T> T& free_get (test <T>& x) { return x.value; } template <typename T> void bar () { test <T> x; x.template member_get <0> (); // template is required here free_get <0> (x); }; 

现有的答案是非常好的,标准委员会对于这个目标是至关重要的。 但是我认为还有另外一个问题很重要。

使用免费function,您可以在更改类定义的情况下修改界面。 你可以简单地通过专门的全球性get任何types的“gettable”。 使用成员函数,您将不得不直接修改该类。

这是基于范围的是build立在std::begin/std::end而不是寻找成员函数的原因之一。 std::begin/end是专门用于数组types的,所以你可以使用基于范围的数组。 您可以将它用于任何容器,即使那些没有begin/endfunction的容器。 您可以将它专门化为例如LibXML2元素types,以便您可以基于范围for xmlElement*的范围。

如果他们必须是会员function,你不能这样做。

在C ++中,自由函数是许多操作的自然界面,可以在许多不同的类上完成。

N3090 / 3092,§20.4.2.6/ 8:“注意:get是一个非成员函数的原因是,如果这个function是作为成员函数提供的,那么types依赖于模板参数的代码将需要使用template关键字。 – 结束注释“