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)); }