特定のインデックスに対するランダムな直接アクセスの必要性が合理的なシナリオであるので、それは実際には少し迷惑で、std :: initializer_listに対して角括弧の演算子を持たないのです。
しかし、この能力は、いくつかの簡単なコードを追加することができます。今、私たちは、私たちがない限り、おそらく世界的なC++メソッドの良い名前ではありません_という名前の新しいグローバル関数(アンダースコア)を持っている
// 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++用の "嫌なような"ユーティリティlibを作成して、他のすべての有用な用途のために_関数をオーバーロードします。
新しい_機能は次のように使用できるようになりました。
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
が繰り返し作成されます。これはもちろん、なぜこれが規格自体によって提供されなかったのだろうかという疑問を提起する。
私の推測では、その主要な使用事例は、順次処理されるリストであるためです。 – PlasmaHH
一般的な使用例は、メモリブロックを割り当て、 'allocator.construct(p、v)'を使ってブロック内の要素を構築するコンストラクタです。リストはまだ順番に処理されていますが、外側のfor-loopはすでに 'operator []'構文に役立つカウンタを持っています。 –
@ void-pointerこれらの状況で通常*コピー*しませんか?そうすれば、ループは必要なくなり、とにかく明示的なループを避けることができます。しかし、問題はまだ有効です。 –