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

Automatyczne instancjonowanie szablonów

Cloud VPS
+1 głos
876 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,570 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 (158,900 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 (158,900 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ź 217 wizyt
pytanie zadane 3 września 2019 w C i C++ przez enigmatycznyclay Bywalec (2,450 p.)
0 głosów
1 odpowiedź 444 wizyt
pytanie zadane 5 czerwca 2019 w C i C++ przez profesorek96 Szeryf (91,400 p.)
0 głosów
1 odpowiedź 235 wizyt
pytanie zadane 7 lutego 2021 w PHP przez CSSoup Mądrala (6,460 p.)

93,484 zapytań

142,417 odpowiedzi

322,763 komentarzy

62,895 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

Kursy INF.02 i INF.03
...