如何使用begin()自由函数
How to use begin() free function
我目前正在编写一个处理通用容器的函数模板。由于这个问题中提到的原因,我想使用std::begin()
和std::end()
。我的问题是,我是否应该使用:
std::begin( myContainer )
或者:
using namespace std; // Better use: "using std::begin"
begin( myContainer )
或者,换句话说,可以在std
命名空间中重载begin()
吗?我是否应该允许我的函数的用户也在其他地方重载全局命名空间中的begin()
函数?STL是如何处理的?
不需要using
指令,所以我们假设第二个代码段包含using
声明。
using std::begin;
如果您要创建自己的容器来使用此函数模板,请提供Container::begin()
和Container::end()
成员函数,然后无论使用第一个还是第二个都没有区别。std::begin()
和std::end()
将在可用时调用各自的成员函数(§24.7[iterator.range])。
另一方面,如果您正在创建一个应该与任何容器、标准库中的容器或自定义容器一起使用的函数模板;我推荐第二种方法。
using std::begin;
begin( myContainer );
请注意,这将使ADL能够在与容器定义相同的命名空间中查找免费函数begin()
和end()
的用户定义重载。重载不应添加到命名空间std
或全局命名空间(除非容器定义也在全局命名空间中)。在没有这些自由函数重载的情况下,std::begin
将被调用(因为using declaration
),而这又将调用Container::begin()
。
在std
命名空间中重载某些内容是不好的,只允许进行专门化。如果你想启用ADL
,你可以使用
using std::begin;
begin(myContainer)
对于自定义容器,std::begin
实际上可以在容器中调用begin
。所以如果你有MyContainerClass::begin
就足够了。与std::end
以及常量迭代器版本std::cbegin
和std::cend
相同。
- 将自由函数绑定为类成员函数
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- 为什么成员函数地址离自由函数这么远?
- 如何使用模板元编程在自由函数C++链接两个不相关的类
- C++ 20 中的运算符 == 和 <=> 应该作为成员还是自由函数实现?
- 如何在共享库中保留静态库中的自由函数
- 在C++项目中管理自由函数有哪些好的做法?
- 使用自由函数作为LPOVELAPPED_COMPLETION_ROUTINE
- 统一检查成员函数、自由函数和算子是否存在的方式
- 使自由函数的行为类似于成员函数 (C++)
- C++自由函数可以别名吗?
- 调用成员函数(如果存在),回退到自由函数,反之亦然
- ADL找不到模板化的自由函数
- 基于方法或自由函数存在的模板构造函数解析
- G 未定义的引用自由函数
- 为什么未调用自由函数作为构造函数中的参数传递
- 自由函数和继承
- 调用自由函数而不是方法(如果不存在)
- 如何将自由函数与对象一起使用
- 如何使用begin()自由函数