potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。はてなブログ無料版なので記事の上の方はたぶん広告です。記事中にも広告挿入されるみたいです。

C++20 STLのrangeをvectorに変換する関数

C++20のコンセプトとrangesの学習用コードです。template <std::ranges::range T>のようにtypenameclassの代わりにコンセプトを指定することで型Tをコンセプトで制限できます。コンセプトにrangeを指定すればrangevectorに変換する関数を定義できます。

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>も使用できます。
  • constexprinlineを内包します。