Bel*_*loc 0 c++ templates auto c++11
在第3章:C++之旅:抽象机制的第82页中,作者写道:
如果我们还想为Vector使用range-for循环,我们必须定义合适的begin()和end()函数:
template<typename T>
T? begin(Vector<T>& x)
{
return &x[0]; // pointer to ?rst element
}
template<typename T>
T? end(Vector<T>& x)
{
return x.begin()+x.size(); // pointer to one-past-last element
}
Run Code Online (Sandbox Code Playgroud)
鉴于这些,我们可以写:
void f2(const Vector<string>& vs) // Vector of some strings
{
for (auto s : vs)
cout << s << ’\n’;
}
Run Code Online (Sandbox Code Playgroud)
请注意,类模板Vector在草稿的第81页中定义.
对于基于范围的工作,编译器需要找到一个合适的函数来获取迭代器.
如果使用的类型是类,它将首先查找成员函数begin
并end
在该类的范围内查找.
如果类型不是类或者没有这样的成员函数,它将通过Argument Dependent Lookup查找它们.
这是基于范围的原因,适用于C阵列.显然,数组不能有成员函数,因此标准库提供了两个与此类似的函数:
template<typename T, size_t N>
T* begin( T(&array)[N] )
{
return array;
}
Run Code Online (Sandbox Code Playgroud)
并且类似地end
.
从标题中回答你的问题:它们可以,但它不是必要的.您可以在与您的类相同的命名空间中定义自由函数,它们将被找到.
归档时间: |
|
查看次数: |
595 次 |
最近记录: |