Это действительно немного раздражает, отсутствие оператора квадратных скобок для 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++, которая будет иметь собственное пространство имен, перегружая _ для всех других полезных применений.
Новую функцию _ теперь можно использовать следующим образом:
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
создается повторно. Что снова, конечно, вызывает удивление, почему это не было предусмотрено самим стандартом.
person
Amir Kirsh
schedule
09.10.2015
allocator.construct(p, v)
. В то время как список все еще обрабатывается последовательно, внешний цикл for уже имеет счетчик, который поддается синтаксисуoperator[]
. - person void-pointer   schedule 22.07.2013uninitialized_copy
сделал бы эту работу более элегантно. Брб, придется рефакторить код =) - person void-pointer   schedule 22.07.2013.begin()[N]
работает, еслиbegin
случайное. - person Yakk - Adam Nevraumont   schedule 22.07.2013