相关疑难解决方法(0)

自定义容器应该有免费的开始/结束功能吗?

当创建一个按照通常规则播放的自定义容器类(即使用STL算法,使用性能良好的通用代码等)时,在C++ 03中实现迭代器支持和成员开始/结束函数就足够了.

C++ 11引入了两个新概念 - 基于范围的for循环和std :: begin/end.基于范围的for循环理解成员开始/结束函数,因此任何C++ 03容器都支持基于范围的开箱即用.对于算法,推荐的方法(根据Herb Sutter的'Writing modern C++ code')是使用std :: begin而不是member function.

但是,此时我不得不问 - 是否建议调用完全限定的begin()函数(即std :: begin(c))或依赖ADL并调用begin(c)?

在这种特殊情况下,ADL似乎毫无用处 - 因为如果可能的话,std :: begin(c)委托给c.begin(),通常的ADL好处似乎不适用.如果每个人都开始依赖ADL,那么所有自定义容器都必须在其必需的命名空间中实现额外的begin()/ end()自由函数.但是,有几个消息来源似乎暗示对开始/结束的不合格调用是推荐的方式(即https://svn.boost.org/trac/boost/ticket/6357).

那么C++ 11的方式是什么?容器库作者是否应该为其类编写额外的开始/结束函数,以便在没有使用namespace std的情况下支持不合格的开始/结束调用; 或者使用std :: begin;?

c++ containers iterator argument-dependent-lookup c++11

58
推荐指数
1
解决办法
4928
查看次数

如何使用begin()自由函数

我目前正在编写一个处理通用容器的函数模板.我想用std::begin()std::end(),因上述原因在这一问题.我的问题是,我是否应该使用:

std::begin( myContainer )
Run Code Online (Sandbox Code Playgroud)

要么:

using namespace std; // Better use: "using std::begin"
begin( myContainer )
Run Code Online (Sandbox Code Playgroud)

或者,换句话说,是否可以begin()std命名空间内重载?我是否应该允许我的函数用户其他地方重载全局命名空间中begin()函数?STL如何处理它?

c++ templates stl generic-programming c++11

2
推荐指数
1
解决办法
968
查看次数