std :: tuple get()成员函数

HC4*_*ica 49 c++ boost tuples c++11

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

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

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

std::get<1>(t);
Run Code Online (Sandbox Code Playgroud)

对我来说看起来更丑陋.

是否有任何特殊原因std::tuple没有会员功能?或者只是我的实施(GCC 4.4)?

dou*_*lep 63

来自C++ 0x草案:

[注意:get是一个非成员函数的原因是,如果此功能是作为成员函数提供的,那么使用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);
};
Run Code Online (Sandbox Code Playgroud)

  • 我知道了.尽管如此,他们可以提供成员和非成员函数,如boost,如果没有其他原因要与boost兼容(因为很多人可能在切换到C++ 0x之前已经使用了boost元组) . (16认同)
  • 现在我们有了不再需要模板关键字的 C++11,我们现在可以完全拥有一个成员函数了吗?只需要一个建议? (3认同)

Nic*_*las 32

现有的答案很棒,标准委员会当然对此至关重要.但是我认为还有一个问题值得一提.

使用自由函数,您可以在更改类定义的情况下修改接口.您可以通过专门化全局来制作任何类型的"gettable" get.使用成员函数,您必须直接修改该类.

基于范围for查找begin/end类类型的成员,但它也begin/end通过ADL 查找非成员.这些API可以与任何容器一起使用,甚至是那些没有begin/end功能的容器.例如,您可以将它专门用于LibXML2元素类型,这样您就可以基于范围forxmlElement*不是.

如果必须是成员函数,则不能这样做.

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

  • `std :: begin/std :: end`也是成员和非成员函数如何很好地协同工作的很好的例子.您可以使用大多数容器. (3认同)

Jer*_*fin 12

N3090/3092,§20.4.2.6/ 8:"注意:get是非成员函数的原因是,如果此功能是作为成员函数提供的,那么使用template关键字需要依赖于模板参数的类型的代码.-注意"