特注のコードを書くことは退屈で分かりやすくなります。
これは、合理的に効率的な汎用コンテナ初期化コードです。イニシャライザーのようにデータを一時的にstd::array
に保存しますが、それはconst
の代わりに出ます。
make_map
は偶数の要素を取ります。最初の要素は2番目の値をキーします。
template<class E, std::size_t N>
struct make_container_t{
std::array<E,N> elements;
template<class Container>
operator Container()&&{
return {
std::make_move_iterator(begin(elements)),
std::make_move_iterator(end(elements))
};
}
};
template<class E0, class...Es>
make_container_t<E0, 1+sizeof...(Es)>
make_container(E0 e0, Es... es){
return {{{std::move(e0), std::move(es)...}}};
}
namespace details{
template<std::size_t...Is, class K0, class V0, class...Ts>
make_container_t<std::pair<K0,V0>,sizeof...(Is)>
make_map(std::index_sequence<Is...>, std::tuple<K0&,V0&,Ts&...> ts){
return {{{
std::make_pair(
std::move(std::get<Is*2>(ts)),
std::move(std::get<Is*2+1>(ts)))
)...
}}};
}
}
template<class...Es>
auto make_map(Es... es){
ststic_assert(!(sizeof...(es)&1), "key missing a value? Try even arguments.");
return details::make_map(
std::make_index_sequence<sizeof...(Es)/2>{},
std::tie(es...)
);
}
これは、それを減らす必要があります:タイプミスがなければ...
static std::map<int, std::unique_ptr<MyClass>> =
make_map(0, std::make_unique<MyClass>());
。
1つのことに変数名を指定する必要があります。 – Galik