Propose to adopt make_array into the IS
C++標準化委員会の文書:Propose to adopt make_array into the IS
make_arrayを規格に導入する提案。
auto ar=std::make_array(1,2,3); // std::array<int,3> ar{1,2,3};
折角なので、実装してみた。
namespace std{ template<class... Args> constexpr decltype(auto) make_array(Args&&... args) { using type=typename std::decay<typename std::common_type<Args...>::type>::type; return std::move(std::array<type,sizeof...(Args)> {static_cast<type>(std::forward<Args>(args))...}); } template<class _Tp> constexpr decltype(auto) make_array() { return std::move(std::array<_Tp,0>{}); } };
数行で済む。なんで今まで規格になかったんだろう。*1
以下のように使える。
int main() { { // P0325R1 Exp. using namespace std; int i=1; int& ri=i; auto a1=make_array(i,ri); auto a2=make_array(i,ri,12L); auto a3=make_array<long>(i,ri); auto a4=make_array<long>(); // auto a5=make_array(); ill-formed auto a6=make_array<double>(1,2); } { auto a1=std::make_array("raw array"); static_assert(std::is_same<decltype(a1),std::array<const char*,1>>::value); } }
*1:目で確認したのでアレだが2013年にはすでに提案自体はあった様子:http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2014/n3824.htm