Wpis z mikrobloga

Czesc,

chcialem napisac sobie funkcje compile-time, ktora zsumuje mi sizeof kazdego elementu w std::tuple, kod wyglada tak:
http://ideone.com/yNH8S3

dziala. Niby. Chcialem dodac sobie constraint za pomoca enable_if tak aby liczone to bylo tylko dla typow POD. Pozniej chce zrobic druga wersje dla mojego specjalnego typu, ew. wymagac, zeby klasy non-POD mialy metode size(). Tutaj cos mi sie wywala i kompilator na mnie krzyczy. Za cholere nie moge dojsc o co mu chodzi. (nie jestem master w metaprogramowaniu wiec pytam tu)
http://ideone.com/WJ7Eyh

any idea?

#programowanie #cpp #cpp11 #cpp14
  • 11
  • Odpowiedz
Albo czegos z tych variadic templateow nie zalapalem albo jestem slepy. No ale generalnie i w enableif jest:

typename std::tuple
element>::type
i w samym ciele

typename std::tupleelement>::type

dlaczego w enableif sie dopierdziela, ze:

error: invalid use of incomplete type 'struct std::tuple_element<0u, std::tuple<> >'


@GitLog: dzieki, pozniej sobie przeczytam, moze faktycznie cos mi umknelo
  • Odpowiedz
@TheNewIcek: terminujesz rekursje przy tuple size == 0 (std::tuple<>), więc std::tupleelement>::type to v̶o̶i̶d̶,̶ ̶a̶ ̶i̶s̶̶p̶o̶d̶ ̶n̶i̶e̶ ̶z̶a̶ ̶b̶a̶r̶d̶z̶o̶ ̶c̶h̶c̶e̶ ̶d̶z̶i̶a̶ł̶a̶ć̶ ̶z̶ ̶v̶o̶i̶d̶o̶w̶y̶m̶ ̶a̶r̶g̶u̶m̶e̶n̶t̶e̶m̶.̶
edit: incomplete type, a więc w wywołanie tupleelement<0,...> nie działa, zaś ono jest potrzebne w twojej implementacji do sprawdzenia ispod.
edit2: widać w compile time evaluowane są oba operandy &&, nawet jeśli pierwszy nie zachodzi.
  • Odpowiedz
@nargil: Dzieki, wlasnie po Twoim poscie doszedlem do troche innego, glupszego rozwiazania, to znaczy wyrzucilem liczenie rozmiaru do osobnej funkcji i tam dalem ten constraint ze sprawdzaniem POD:
http://ideone.com/rCfeHc
w tym wypadku nie mam specjalizacji template'a dla "I" poza zakresem. W kazdym razie Twoje rozwiazanie jest czytelniejsze. :-)
  • Odpowiedz
@TheNewIcek: zrób hybrydę obu rozwiązań :) tj do mojego sposobu iteracji wstaw twoje calculatesize, które fajni desygnuję logikę ispod do funkcji liczącej jeden rozmiar.
  • Odpowiedz
@nargil: :D musze dodac jeszcze rekursje wyspecjalizowana dla typu std::tuple... ( ͡° ʖ̯ ͡°) dla case'a tuple in tuple tuple, int> ;-D to metaprogramowanie w C++ jednak ryje beret
  • Odpowiedz
@nargil: Racja, zepsulem to zachowanie przekazujac do calculate_size juz tylko element pobrany get*(t) a nie cala tuple (calculate_size(T& t)). Chcialem poprawic czytelnosc a wywalilem funkcjaonalnosc ktora dostalem "gratis" :D. Za duzo rekurencji na dzis*
  • Odpowiedz