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