确实有点烦人,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);
}
现在我们有了一个名为 _(下划线)的新全局函数,这对于全局 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;
}
需要注意的是,如果您运行 std::initializer_list 的许多项,上述提供的解决方案在性能方面并不划算,因为上述建议类型的临时对象_init_list_with_square_brackets
是重复创建的。当然,这再次引发了为什么标准本身没有提供这一点的疑问。