Używanie index_sequence
i rodzajem pomocnika alias można wygenerować typ chcesz:
// Just something to take a size_t and give the type `int`
template <std::size_t>
using Integer = int;
// will get a sequence of Is = 0, 1, ..., N
template <std::size_t... Is>
auto func_impl(std::index_sequence<Is...>) {
// Integer<Is>... becomes one `int` for each element in Is...
return std::tuple<Integer<Is>...>{};
}
template <std::size_t N>
auto func() {
return func_impl(std::make_index_sequence<N>{});
}
Warto wołając, że w ogólnym przypadku będzie prawdopodobnie być lepiej z std::array
(w twoim przypadku nie możesz go użyć), ale std::array
może zachowywać się jak krotka, podobnie jak std::pair
.
Aktualizacja: ponieważ jasno dałeś do zrozumienia, że pracujesz z wersją C++ 11, a nie 14+, musisz uzyskać implementację index_sequence
i pokrewną gdzieś (here to libC++). Oto wersja C++ 11 func
i func_impl
z wyraźnych typów obie strony:
template <std::size_t... Is>
auto func_impl(std::index_sequence<Is...>) -> std::tuple<Integer<Is>...> {
return std::tuple<Integer<Is>...>{};
}
template <std::size_t N>
auto func() -> decltype(func_impl(std::make_index_sequence<N>{})) {
return func_impl(std::make_index_sequence<N>{});
}
Co próbowaliście do tej pory? – user2079303
obowiązkowe: czy rozważałeś użycie tylko 'std :: array'? Możesz użyć 'tablica' podobnie jak krotka (z' std :: tuple_size', 'std :: get', etc) i bardzo by to uprościć. –
@ user2079303, moją intuicją jest utrzymywanie listy typów, odliczanie od N do 0 i dodawanie int do listy, gdy licznik jest zmniejszany. Gdy N wynosi 0, zwraca tę krotkę z listą typów. Ale nie wiem, jak to wykonać. – yuefengz