C++20のコンセプトとrangesの学習用コードです。template <std::ranges::range T>
のようにtypename
やclass
の代わりにコンセプトを指定することで型Tをコンセプトで制限できます。コンセプトにrange
を指定すればrange
をvector
に変換する関数を定義できます。
template <std::ranges::range T>
はrequires
でも代替可能です。
// C++20 #include <vector> #include <ranges> #include <algorithm> template <std::ranges::range T> constexpr std::vector<std::ranges::range_value_t<T>> to_vector(T r) { return { std::ranges::begin(r), std::ranges::end(r) }; } int main() { std::vector<int> x(10); auto y = to_vector(x | std::views::transform([](const auto& x) {return x * 100; })); return 0; }
メモ
template <std::ranges::range T>
の代わりにtemplate <typename T>
とrequires std::ranges::range<T>
も使用できます。constexpr
はinline
を内包します。