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; }
簡単な実装ですけどこんな感じで出来ました。
[追記]
コンパイルエラーになっていたので修正。
あと実装もちょこっと修正。