Jakiś czas temu, rozwiązanie do drukowania std :: tuple zostało opublikowane here. W większości dostaję to, co się dzieje. Mam problem ze zrozumieniem, co dzieje się w funkcji print_tuple.Anatomia ładnej krotki wydruk
template<class Ch, class Tr, class Tuple, std::size_t... Is>
void print_tuple(std::basic_ostream<Ch,Tr>& os, Tuple const& t, seq<Is...>){
using swallow = int[];
(void)swallow{0, (void(os << (Is == 0? "" : ", ") << std::get<Is>(t)), 0)...};
}
Nie dostaję tego, co dzieje się w ciele tej funkcji. O ile wiem, ma to coś wspólnego z rozpakowywaniem Is
. Rozumiem, że warunek, Is == 0
sprawdza, czy jesteśmy w głównym elemencie.
Co się dzieje?
Kod konstruuje (a następnie wyrzuca) tablicę 'int []' z listy inicjalizacyjnej, gdzie każdy element ma wartość 0, ale drukuje jeden element krotki jako efekt uboczny (za pośrednictwem operatora przecinkowego). Używanie listy inicjalizującej jest po prostu przejściem do kontekstu, w którym działałoby rozwinięcie paczki. –
Ah! Zatem konstrukt 'swallow {...}' jest listą inicjalizacji dla int []. Nie zauważyłem tego na pierwszy rzut oka. – sguzman