• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Automatyczne instancjonowanie szablonów

Object Storage Arubacloud
+1 głos
492 wizyt
pytanie zadane 21 sierpnia 2018 w C i C++ przez draghan VIP (106,230 p.)

Hej. Załóżmy, że mam szablon o takiej sygnaturze:

template <class... Args>
void foo(const Args &... args);

Chciałbym utworzyć kilkanaście instancji, gdzie szablon byłby parametryzowany według schematu:

void foo(T);
void foo(T, T);
void foo(T, T, T);
void foo(T, T, T, T);
// ...
void foo(T, T, T, T, T, T, T, T, T, T, T, T, T, T, T);
void foo(T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T);

Czy można to jakoś elegancko zlecić kompilatorowi, żeby nie tworzyć takich choinek w kodzie?

komentarz 22 sierpnia 2018 przez criss Mędrzec (172,590 p.)
Do czego ci to właściwie potrzebne? Bo szczerze to nie widze innego powodu niż chęć definicji w source file. Pytam, bo może wcale nie musisz tego robić.
komentarz 22 sierpnia 2018 przez draghan VIP (106,230 p.)
Wydaje mi się, że muszę. :) Rejestruję interfejs do wykorzystania po stronie skryptów w ChaiScript i potrzebuję mieć skonkretyzowane funkcje.

Generalnie mam to, czego potrzebuję - zaimplementowałem to metodą Kopi-Pastego. Ale takie choinki wyglądają brzydko, stąd pytanie czy można zastosować jakiś zgrabny trick do ich redukcji.

2 odpowiedzi

+1 głos
odpowiedź 21 sierpnia 2018 przez Arkadiusz Sikorski Pasjonat (20,160 p.)

Poszukaj czegoś dla preprocesora, coś jak BOOST_PP_REPEAT

komentarz 21 sierpnia 2018 przez draghan VIP (106,230 p.)
Słowa "elegancko" i "preprocesor" w jednym zdaniu to jakaś aberracja. :) Poczekam na inne sugestie. Aczkolwiek jest to zawsze jakaś opcja, dzięki! :)
komentarz 21 sierpnia 2018 przez Patrycjerz Mędrzec (192,320 p.)
Niezupełnie. Preprocesor, jak każde inne narzędzie, jest ryzykowne w swoim działaniu, ale to nie oznacza, że nie powinniśmy z niego korzystać. Moim zdaniem wymowne narzędzie jest praktycznie odporne na błędy. Przecież nikt zdrowy na umyśle nie wsadzi do twojego makra jakiś dziwnych danych, jeśli obok będzie miał poprawne jego użycie.

Jeśli się mylę, to zapraszam do dyskusji.
1
komentarz 22 sierpnia 2018 przez draghan VIP (106,230 p.)

Preprocesor, jak każde inne narzędzie, jest ryzykowne w swoim działaniu, ale to nie oznacza, że nie powinniśmy z niego korzystać.

Tego nie powiedziałem (zapewniam Cię, że wykorzystuję go namiętnie, załączając nagłówki :), więc chyba EOT. :)

+1 głos
odpowiedź 21 sierpnia 2018 przez mokrowski Mędrzec (155,460 p.)

Jeśli nie preprocesor, to użyj zewnętrznego programu który Ci taki kod wygeneruje. W zależności od środowiska jakieś języki skryptowe lub narzędzia konsolowe. Łatwo podepniesz to do systemu budowania, ew. konfigurację wyprowadzisz na zewnątrz do pliku. Skrypt to sobie sparsuje i wyprowadzi do pliku gdzie będziesz miał wymuszenia instancjonowania. Jak rozumiem raczej interesuje Cię takie coś jako wymuszenie instancji szablonu w pliku *.o / *.obj (jaki tam byś nie miał kompilaor):

template void foo(const int&);
template void foo(const int&, const int&);

Chodzi o wymuszenie instancji aby linker zorientował się ze jest takowa w *.o czy o coś innego?

To jest taka struktura?

/* foo.hpp file */
#pragma once 

template <class... Args>
void foo(const Args &... args);

 

#include "foo.hpp"

template <class... Args>
void foo(const Args &... args) {
     // any implementation
}

#include "foo.tcc"

 

/* foo.tcc */

template void foo(const int&);
template void foo(const int&, const int&);
// ... 

... czy coś innego?

komentarz 22 sierpnia 2018 przez draghan VIP (106,230 p.)

Jeśli nie preprocesor, to użyj zewnętrznego programu który Ci taki kod wygeneruje.

Nieee, to nie tak (x2).
(1) Nie mówię, że "preprocesora nie użyję bo mi tego zabrania wiara" - jeśli sam kompilator na to nie pozwala, to sięgnę po preprocesor. :)
(2) Użycie jakiegokolwiek toola nie załatwia sprawy, bo w źródle i tak w końcu dostanę explicite wpisaną każdą instancję - co wygląda źle.

Chodzi o wymuszenie instancji aby linker zorientował się ze jest takowa w *.o czy o coś innego?

Jak już gdzieś wyżej pisałem:

Rejestruję interfejs do wykorzystania po stronie skryptów w ChaiScript i potrzebuję mieć skonkretyzowane funkcje.

co można zobaczyć na załączonym przykładzie.

komentarz 22 sierpnia 2018 przez mokrowski Mędrzec (155,460 p.)
Ok zrozumiałem. W fazie 8 przetwarzania (gdzie działają szablony), kompilator nie pozwala już na emisję kodu. Jeśli chcesz kod wyemitować do dalszych faz, zrób to w fazie 4 gdzie działa preprocesor. A że preprocesor źle wygląda, przyjmij to po męsku :)
komentarz 22 sierpnia 2018 przez draghan VIP (106,230 p.)
Ok, pomogłeś mi tym komentarzem. :) Dzięki! Jeszcze poczekam jakiś czas z zamykaniem, może ktoś coś dorzuci do tematu.

Podobne pytania

0 głosów
1 odpowiedź 142 wizyt
pytanie zadane 3 września 2019 w C i C++ przez enigmatycznyclay Bywalec (2,450 p.)
0 głosów
1 odpowiedź 290 wizyt
pytanie zadane 5 czerwca 2019 w C i C++ przez profesorek96 Szeryf (91,420 p.)
0 głosów
1 odpowiedź 152 wizyt
pytanie zadane 7 lutego 2021 w PHP przez CSSoup Mądrala (6,460 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...