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/end
function的容器。 您可以将它专门化为例如LibXML2元素types,以便您可以基于范围for
xmlElement*
的范围。
如果他们必须是会员function,你不能这样做。
在C ++中,自由函数是许多操作的自然界面,可以在许多不同的类上完成。
N3090 / 3092,§20.4.2.6/ 8:“注意:get是一个非成员函数的原因是,如果这个function是作为成员函数提供的,那么types依赖于模板参数的代码将需要使用template关键字。 – 结束注释“