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)
Nic*_*las 32
现有的答案很棒,标准委员会当然对此至关重要.但是我认为还有一个问题值得一提.
使用自由函数,您可以在不更改类定义的情况下修改接口.您可以通过专门化全局来制作任何类型的"gettable" get.使用成员函数,您必须直接修改该类.
基于范围for查找begin/end类类型的成员,但它也begin/end通过ADL 查找非成员.这些API可以与任何容器一起使用,甚至是那些没有begin/end功能的容器.例如,您可以将它专门用于LibXML2元素类型,这样您就可以基于范围for而xmlElement*不是.
如果必须是成员函数,则不能这样做.
在C++中,自由函数是许多操作的自然界面,可以在许多不同类上完成.
Jer*_*fin 12
N3090/3092,§20.4.2.6/ 8:"注意:get是非成员函数的原因是,如果此功能是作为成员函数提供的,那么使用template关键字需要依赖于模板参数的类型的代码.-注意"
| 归档时间: |
|
| 查看次数: |
14045 次 |
| 最近记录: |