|
|
||||||
|
#1
|
|
|
|
|
Witam,
Potrzebuję stworzyć dwa typy, będące wskaźnikami do odpowiednich funkcji (bezargumentowej i argumentowej). Zatem utworzyłem typy: typedef void (*thread_entry_t)(void); template<typename T> typedef void (*parameterized_thread_entry_t)(T args); Drugi typ jest błędny, zatem moje pytanie brzmi: czy można to w jakiś sposób zrealizować? |
|
|
|
#2
|
|
|
|
|
Marcin Zamorski pisze:
> Witam, > > Potrzebuję stworzyć dwa typy, będące wskaźnikami do odpowiednich funkcji > (bezargumentowej i argumentowej). Zatem utworzyłem typy: > > typedef void (*thread_entry_t)(void); > > template<typename T> > typedef void (*parameterized_thread_entry_t)(T args); > > Drugi typ jest błędny, zatem moje pytanie brzmi: czy można to w jakiś > sposób zrealizować? Ztcw nie możesz parametryzować typu. Trzeba opakować w klasę: template<typename T> struct parameterized_thread_entry{ typedef void (*t)(T args); }; i potem używać parameterized_thread_entry<int>::t. |
|
#3
|
|
|
|
|
Użytkownik "Michoo" <michoo_news> napisał w wiadomości
news:spe1 > Marcin Zamorski pisze: > Ztcw nie możesz parametryzować typu. Trzeba opakować w klasę: > template<typename T> struct parameterized_thread_entry{ > typedef void (*t)(T args); > }; > i potem używać parameterized_thread_entry<int>::t. > Niestety, takie rozwiązanie nie chce działać. Proszę rzucić okiem na mój kod: |
|
#4
|
|
|
|
|
Marcin Zamorski pisze:
> Niestety, takie rozwiązanie nie chce działać. Proszę rzucić okiem na mój > kod: To Twój kod nie działa a nie moje rozwiązanie ;) > public: > ParameterizedThreadEntry(parameterized_thread_entr y<T>::t Brakuje tutaj typename, skoro używasz typu z szablonu w innym szablonie. ParameterizedThreadEntry(typename parameterized_thread_entry<T>::t [...] |
|
#5
|
|
|
|
|
On 03/03/2010 17:53, Marcin Zamorski wrote:
> Witam, > > Potrzebuję stworzyć dwa typy, będące wskaźnikami do odpowiednich funkcji > (bezargumentowej i argumentowej). Zatem utworzyłem typy: > > typedef void (*thread_entry_t)(void); > > template<typename T> > typedef void (*parameterized_thread_entry_t)(T args); > > Drugi typ jest błędny, zatem moje pytanie brzmi: czy można to w jakiś > sposób zrealizować? typedef void (*parameterized_thread_entry_t)(void* args); To jest niebezpieczne wtedy jeżeli ten typ jest dostępny publicznie; jeżeli jest szczegółem implementacji to wtedy masz kontrolę nad faktycznym typem przekazanego wskaźnika, więc możesz wykonać bezpieczny reinterpret_cast w drugą stronę wewnątrz funkcji. Tak się robi type erasure. B. |
|
#6
|
|
|
|
|
Użytkownik "Bronek Kozicki" <brok> napisał w wiadomości
news:8da3 > On 03/03/2010 17:53, Marcin Zamorski wrote: >> > typedef void (*parameterized_thread_entry_t)(void* args); > > To jest niebezpieczne wtedy jeżeli ten typ jest dostępny publicznie; > jeżeli jest szczegółem implementacji to wtedy masz kontrolę nad > faktycznym typem przekazanego wskaźnika, więc możesz wykonać bezpieczny > reinterpret_cast w drugą stronę wewnątrz funkcji. Tak się robi type > erasure. >> B. Bardzo dziękuję za wskazówki. |
|
#7
|
|
|
|
|
Użytkownik "Michoo" <michoo_news> napisał w wiadomości
news:9fs1 > Marcin Zamorski pisze: >> Niestety, takie rozwiązanie nie chce działać. Proszę rzucić okiem na mój >> kod: > To Twój kod nie działa a nie moje rozwiązanie ;) >> public: >> ParameterizedThreadEntry(parameterized_thread_entr y<T>::t > Brakuje tutaj typename, skoro używasz typu z szablonu w innym szablonie. > > ParameterizedThreadEntry(typename parameterized_thread_entry<T>::t > [...] > Zgadza się, teraz już wsyztsko działa tak jak powinno. Dziękuję za pomoc. |
|
|
| Podobne wątki | |
| Typedef w klasie szablonowej Takie coś nie kompiluje się w gcc 4.3.3: template<typename X> class A { public: typedef int type; type foo(); }; /* "expected constructor, destructor, |
|
| wskaznik do funkcji szablonowej (template) witam, jak (jesli sie da) przekazac do funkcji parametr, ktory jest wskaznikiem do funkcji szablonowej? template <class C> void f_sort1(const vector<C> &) - jakas funcja... |
|
| Wywołanie funkcji szablonowej Mam taki problem. W jednym pliku mam funkcję szablonową: template <class T> void AddToLog(T msg) { ofstream log("log.txt", ios::app); log << msg <<... |
|
| g++, standard, specjalizacja funkcji szablonowej i cos jeszcze :) Witam Ostatnio niechcący zauważyłem, że g++ (3.2) pozwala na takie coś, np: int a=10; int b=30; int (*wsk)[b] = new int[a][b]; Dopiero kompilacja z opcją -pedantic-errors... |
|
|
Czasy w strefie GMT. Teraz jest 23:06. | Privacy Policy
|