まずはその準備として、max_size() を定義します。
コンテナのサイズを上限よりも大きくしようとすると、std::length_error 例外が投げられます。その上限を示すのが、max_size() です。
template <typename T> class myvector { ... private: enum : size_type { MAX_SIZE_BYTES = std::numeric_limits<size_type>::max(), MAX_SIZE = MAX_SIZE_BYTES / sizeof(value_type), }; public: ... /** * @brief Returns the maximum number of elements the container is able to * hold due to system or library implementation limitations, i.e. * std::distance(begin(), end()) for the largest container. * @return Maximum number of elements. */ size_type max_size(void) const noexcept { return MAX_SIZE; } ... };enumハックを使った、少し凝った定義にしてみました。
まず、MAX_SIZE_BYTES で領域確保する最大バイト数を定義します。ここでは size_t の最大値となっています。
次に、MAX_SIZE で要素数を何個保持できるかを定義します。
max_size() 関数の中身は、MAX_SIZE を返すのみです。max_size() の戻り値を constexpr化することは可能ですが、標準ではそのようになっていないので、ここでも constexpr化は見送りました。
全ソースコード:
https://github.com/suomesta/myvector/tree/master/007
0 件のコメント:
コメントを投稿