meryngii.neta

今日も新たな"ネタ"を求めて。

template concept

Committee Draftへのコメント一覧 - Faith and Brave - C++で遊ぼう
私の意見(41.)もまとめて下さったようで感謝。
fstreamのファイル名がconst wchar_t*を取れないのも加えて欲しいです。
さて、読み進めていくと、14.の提案の最後に強烈なおまけがくっついていました。

template <concept Iterator>// ※コンセプトを受け取るテンプレートパラメータ
concept Range<typename T> {
	Iterator iterator;
	iterator begin(T&);
	iterator end(T&);
};

template<Range<RandomAccessIterator> Rng>
	requires std::ShuffleIterator<T::iterator> &&
		std::LessThanComparable<T::iterator::value_type>
void sort(Rng& range) {
	std::sort(begin(range), end(range));
}

ここで編み出されたらしいです。名前を付けるとすれば、テンプレートコンセプト?
TってRngのことかな?とするとこうではないでしょうか。

// たぶんこんなコード
template <std::Range<std::RandomAccessIterator> Rng>
	requires std::ShuffleIterator<Rng::iterator> &&
		 std::LessThanComparable<Rng::iterator::value_type>
void sort(Rng& range) {
	std::sort(begin(range), end(range));
}

RandomAccessIteratorはsort(first, last)の要件に無いはずです。やっぱりありました。サーセン。(上にあったとは…)
でもこれはカオスになるだけのような気がします。私は現行の仕様で十分だと思います。

// 現行仕様で通るコード(たぶん)
template <std::Range Rng>
	requires std::RandomAccessIterator<Rng::iterator> &&
		std::ShuffleIterator<Rng::iterator> &&
		std::LessThanComparable<Rng::iterator::value_type>
void sort(Rng& range) {
	std::sort(begin(range), end(range));
}

ここにも書いてありますが、私も最適化などを考えるとRangeの要求はInputIteratorが的確だと思います。

追記

適当にコンセプトを書けばそれで済みそうな予感。

concept SortableIterator<typename T>
{
	requires std::RandomAccessIterator<T> &&
		std::ShuffleIterator<T> &&
		std::LessThanComparable<T::value_type>;
}

template <std::Range Rng>
	requires SortableIterator<Rng::iterator>
void sort(Rng& range) {
	std::sort(begin(range), end(range));
}

例の機能があればこんな感じ。

template <std::Range<SortableIterator> Rng>
void sort(Rng& range) {
	std::sort(begin(range), end(range));
}