voi*_*ter 35 c++ iterator operator-overloading initializer-list c++11
假设您正在编写一个接受被std::initializer_list
调用list
的函数,并且该函数需要随机访问其list
元素.写list[i]
代替是方便的list.begin()[i]
.那么为什么不std::initializer_list
提供定义operator[]
呢?
我想不出任何operator[]
返回const T&
不明确的情况.效率在这里似乎不是问题,因为std::initializer_list<T>::iterator
别名const T*
,显然是随机访问迭代器.
Hom*_*er6 11
根据Bjarne Stroustrup在C++编程语言第17版第17.3.4.2节(第497页)中的说法:
不幸的是,initializer_list不提供下标.
没有进一步的理由.
我的猜测是,这是以下原因之一:
2和4听起来有点弱.我的钱是1.
这确实有点烦人,没有 std::initializer_list 的方括号运算符,因为需要随机直接访问特定索引是一个合理的场景。
但是,可以通过一些简单的代码添加此功能:
// the class _init_list_with_square_brackets provides [] for initializer_list
template<class T>
struct _init_list_with_square_brackets {
const std::initializer_list<T>& list;
_init_list_with_square_brackets(const std::initializer_list<T>& _list): list(_list) {}
T operator[](unsigned int index) {
return *(list.begin() + index);
}
};
// a function, with the short name _ (underscore) for creating
// the _init_list_with_square_brackets out of a "regular" std::initializer_list
template<class T>
_init_list_with_square_brackets<T> _(const std::initializer_list<T>& list) {
return _init_list_with_square_brackets<T>(list);
}
Run Code Online (Sandbox Code Playgroud)
现在我们有了一个名为 _(下划线)的新全局函数,它对于全局 C++ 方法来说可能不是一个好名字,除非我们想为 C++ 创建一些“类似 undescore”的实用程序库,它有自己的命名空间,重载_ 函数用于各种其他有用的用法。
现在可以像这样使用新的 _ 函数:
void f(std::initializer_list<int> list) {
cout << _(list)[2]; // subscript-like syntax for std::initializer_list!
}
int main() {
f({1,2,3}); // prints: 3
cout << _({1,2,3})[2]; // works also, prints: 3
return 0;
}
Run Code Online (Sandbox Code Playgroud)
需要注意的是,如果您运行 std::initializer_list 的许多项,则上面提供的解决方案在性能方面并不是一个好交易,因为上面建议类型的临时对象_init_list_with_square_brackets
是重复创建的。这当然再次引发了为什么标准本身没有提供这一点的疑问。
归档时间: |
|
查看次数: |
8163 次 |
最近记录: |