hilpers


  hilpers > comp.lang.* > comp.lang.c

 #1  
03.03.2010, 16:53
Marcin Zamorski
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  
03.03.2010, 17:07
Michoo
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  
03.03.2010, 17:45
Marcin Zamorski
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  
03.03.2010, 18:18
Michoo
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  
03.03.2010, 18:36
Bronek Kozicki
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  
03.03.2010, 20:50
Marcin Zamorski
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  
03.03.2010, 20:52
Marcin Zamorski
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