Sprout の make_array と make_common_array

最近 Boost ML で『make_array を用意しよう』みたいな提案がなされています。


内容はあんまり読んでないんですが個人的にはあってもいいかなーと思っています。
最終的にどうなるんかな。


で、それはそれとして Sprout.Array にも array を生成する make_array 関数 と make_common_array 関数が用意されています。

[make_array]

sprout::make_array は 値の型を渡して定義します。

constexpr sprout::array<float, 3> v = sprout::make_array<float>(1, 2, 3);
static_assert(sprout::get<0>(v) == 1.0f, "");
static_assert(sprout::get<1>(v) == 2.0f, "");
static_assert(sprout::get<2>(v) == 3.0f, "");

constexpr sprout::array<float, 3> v2 = sprout::make_array<float>(1, 1.25f, 3.95);
static_assert(sprout::get<0>(v2) == 1.0f, "");
static_assert(sprout::get<1>(v2) == 1.25f, "");
static_assert(sprout::get<2>(v2) == 3.95f, "");


明示的に型を定義したい場合に使用しますね。

[make_common_array]

sprout::make_common_array は sprout::make_array とは違い、引数の型から std::common_type を使用して値の型を定義します。

constexpr sprout::array<int, 3> v = sprout::make_common_array(1, 2, 3);
static_assert(sprout::get<0>(v) == 1, "");
static_assert(sprout::get<1>(v) == 2, "");
static_assert(sprout::get<2>(v) == 3, "");

constexpr sprout::array<double, 3> v2 = sprout::make_common_array(1, 1.25f, 3.95);
static_assert(sprout::get<0>(v2) == 1.0, "");
static_assert(sprout::get<1>(v2) == 1.25, "");
static_assert(sprout::get<2>(v2) == 3.95, "");

constexpr sprout::array<sprout::string<4>, 2>
    v3 = sprout::make_common_array(sprout::to_string("homu"), sprout::to_string("an"));
static_assert(sprout::get<0>(v3) == "homu", "");
static_assert(sprout::get<1>(v3) == "an", "");


書き方は std::make_tuple とかと似ていますね。
こっちはよく使います。

[ソース]

#include <iostream>
#include <sprout/array.hpp>
#include <sprout/string.hpp>

int
main(){
    {
        constexpr sprout::array<int, 3> v = sprout::make_common_array(1, 2, 3);
        static_assert(sprout::get<0>(v) == 1, "");
        static_assert(sprout::get<1>(v) == 2, "");
        static_assert(sprout::get<2>(v) == 3, "");

        constexpr sprout::array<double, 3> v2 = sprout::make_common_array(1, 1.25f, 3.95);
        static_assert(sprout::get<0>(v2) == 1.0, "");
        static_assert(sprout::get<1>(v2) == 1.25, "");
        static_assert(sprout::get<2>(v2) == 3.95, "");
        
        constexpr sprout::array<sprout::string<4>, 2>
            v3 = sprout::make_common_array(sprout::to_string("homu"), sprout::to_string("an"));
        static_assert(sprout::get<0>(v3) == "homu", "");
        static_assert(sprout::get<1>(v3) == "an", "");
    }

    {
        constexpr sprout::array<float, 3> v = sprout::make_array<float>(1, 2, 3);
        static_assert(sprout::get<0>(v) == 1.0f, "");
        static_assert(sprout::get<1>(v) == 2.0f, "");
        static_assert(sprout::get<2>(v) == 3.0f, "");

        constexpr sprout::array<float, 3> v2 = sprout::make_array<float>(1, 1.25f, 3.95);
        static_assert(sprout::get<0>(v2) == 1.0f, "");
        static_assert(sprout::get<1>(v2) == 1.25f, "");
        static_assert(sprout::get<2>(v2) == 3.95f, "");
    
    }

    return 0;
}