c++ - 如何使用 begin() 自由函数

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

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

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 声明),这又将调用 Container::begin ()

关于c++ - 如何使用 begin() 自由函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21107371/

相关文章:

c++ - 固定动态大小的容器

c++ - 如何为 Visual C++ 2010 中的所有新类创建一个简单的注释标题模板?

c++ - 程序仅打印 C++ 数组中的前三个字符

c++ - WTL CListViewCtrl getSelectedItem 导致我断言失败

c++ - 是否可以为每个循环删除 c++11 中 std::list 的元素

c++ - 来自模板类的模板参数的 typedef 是不可见的

c++ - 避免在此模板代码中创建变量

c++ - Poco C++ 库 : "Not found: mysql"

c++ - C++中的字符串替换

c++ - CString.Format 以相同的精度产生不同的值