2012-12-27 11 views
8

To dość długa fotografia, ponieważ nie jestem pewien, czy to możliwe, ale może ktoś bardziej doświadczony ode mnie w metaprogramowaniu szablonowym oświeci mnie.Wyodrębnianie konwencji wywołania z typu funkcji za pomocą metaprogramowania szablonowego w języku C++

Piszę zautomatyzowaną funkcję lua system wiążącej za pomocą szablonów, wydobywania rodzaj funkcji za pomocą częściowej specjalizacji:

template<typename T, T FUNCTION> class Function_c; 
template<typename R, R (*FUNCTION)()> class Function_c<R (*)(), FUNCTION>; //specialized version 

Problem jest, nie mów mi funkcję konwencji wywołania, więc (w VS2012 32 bity) nie skompiluje się dla __stdcall, a zawiedzie się z __fastcall. Mogę stworzyć kolejną specjalną wersję do czynienia ze szczególnym konwencji wywołującego, np:

template<typename R, R (__stdcall *FUNCTION)()> class Function_c<R (__stdcall *)(), FUNCTION>; 

Ale liczba permutacji zaczyna wymknąć się spod kontroli: 2 (globalne & funkcji składowych) razy maksymalna liczba parametrów razy liczby zwoływania konwencji.

Zastanawiam się, czy istnieje jakiś sposób, aby uzyskać konwencję wywoływania jako parametr szablonu (prawdopodobnie nie, ponieważ tak naprawdę nie jest to typ), aby zmniejszyć ilość danych z kopiowaniem.

Odpowiedz

1

W przypadku tego typu parametrów można wykonać jedną z następujących czynności.

dodać jeden dodatkowy parametr

Szablon będzie wtedy wyglądać tak:

template < typename T, T function, typename CallType > class Function_c;

można łatwo ukryć faktycznie wysyłają wewnątrz CallType, więc konieczne będzie tylko do realizacji jednego klasa dla każdego typu połączenia.

Bądź owinięcie

Zgaduję, że twoja klasa jest już obiekt wrapper, ale łatwo można pójść o krok dalej.

Można utworzyć opakowanie dla każdego z typów połączeń, można następnie zmienić szablon do:

template < typename T, typename Functor > class Function_c;

Instanciating tak: Function_c<int, WrapperStdCall<int (*)()> > x;

Powiązane problemy