まずはその準備として、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 件のコメント:
コメントを投稿