make_array

前回書いたアレで、Sprout でいうところの make_array と make_common_array を同名の関数として定義出来そうなのでやってみました。

[ソース]

#include <type_traits>
#include <array>

template<typename ...Args>
std::array<
    typename std::common_type<typename std::decay<Args>::type...>::type,
    sizeof...(Args)
>
make_array(Args&&... args){
    return {{ std::forward<Args>(args)... }};
}

template<typename T, typename ...Args>
std::array<
    T,
    sizeof...(Args) + 1
>
make_array(typename std::common_type<T>::type t, Args&&... args){
    return {{ t, std::forward<Args>(args)... }};
}



int
main(){
    static_assert(std::is_same<decltype(make_array(1, 2, 3)), std::array<int, 3>>{}, "");
    static_assert(std::is_same<decltype(make_array(1, 2.0f)), std::array<float, 2>>{}, "");
    static_assert(std::is_same<decltype(make_array(1, 2.0f, 3.0)), std::array<double, 3>>{}, "");
    static_assert(std::is_same<decltype(make_array(3.0, 1, 2.0f)), std::array<double, 3>>{}, "");

    static_assert(std::is_same<decltype(make_array<float>(1, 2, 3)),      std::array<float, 3>>{}, "");
    static_assert(std::is_same<decltype(make_array<int>(1, 2.0f, 3.0)),   std::array<int, 3>>{}, "");
    static_assert(std::is_same<decltype(make_array<float>(1, 2.0f, 3.0)), std::array<float, 3>>{}, "");
    return 0;
}


簡単な実装ですけどこんな感じで出来ました。

[追記]

コンパイルエラーになっていたので修正。
あと実装もちょこっと修正。