Addresse einer Instanzierung eines Funktionstemplates?
-
Möp!
Kann man die Addresse einer bestimmten Instanzierung eines Funktionstemplates holen? Mein Compiler streikt nämlich gerade und ich finde den Fehler gerade nicht...
#define VIRTUAL_INIT(base, name, r, ...) \ virtual_##name##_pf(pack<__VA_ARGS__>()) = &virtual_##name##_wrapper_function<r, base*, __VA_ARGS__>;#define VIRTUAL_FUNCTION_FAMILY(base, derived, name) \ template <typename R, typename... P> \ static R virtual_##name##_wrapper_function(base* obj, P&&... args) \ { \ return static_cast<derived*>(obj)->virtual_##name##_pf(pack<P...>())(std::forward<P>(args)...); \ }Diese beiden Makros werden dann innerhalb einer Klasse verwendet. Hier noch ein (leider nicht kompilierbares) Beispiel:
#include <iostream> #include <utility> template <typename...> struct pack {}; template <typename... Args> pack<Args...> make_pack(Args&&...) { return pack<Args...>(); } #define VIRTUAL_PURE_FUNCTION(name, r, ...) \ r (*& virtual_##name##_pf (pack<__VA_ARGS__>) const) (base*, __VA_ARGS__) \ { \ static r (* pf) (base*, __VA_ARGS__) = 0; \ return pf; \ } #define VIRTUAL_FUNCTION_FAMILY(base, derived, name) \ template <typename R, typename... P> \ static R virtual_##name##_wrapper_function(base* obj, P&&... args) \ { \ return static_cast<derived*>(obj)->name(std::forward<P>(args)...); \ } #define VIRTUAL_INIT(base, name, r, ...) \ virtual_##name##_pf(pack<__VA_ARGS__>()) = &virtual_##name##_wrapper_function<r, base*, __VA_ARGS__>; #define VIRTUAL_CALL(obj, name, ...) \ (obj)->virtual_##name##_pf(make_pack(__VA_ARGS__))((obj), __VA_ARGS__); struct base { VIRTUAL_PURE_FUNCTION(println, void, int) VIRTUAL_PURE_FUNCTION(println, void, double) }; struct derived : base { derived() { VIRTUAL_INIT(base, println, void, int) VIRTUAL_INIT(base, println, void, double) } VIRTUAL_FUNCTION_FAMILY(base, derived, println) void println(int n) { std::cout << n << '\n'; } void println(double n) { std::cout << n << '\n'; } }; int main() { base* b = new derived; VIRTUAL_CALL(b, println, 5); return 0; }../main.cpp:40:1: error: no matches converting function 'virtual_println_wrapper_function' to type 'void ()(struct base, int) {aka void ()(struct base, int)}'
../main.cpp:44:2: error: candidate is: template<class R, class ... P> static R derived::virtual_println_wrapper_function(base*, P&& ...)
../main.cpp:41:1: error: no matches converting function 'virtual_println_wrapper_function' to type 'void ()(struct base, double) {aka void ()(struct base, double)}'
../main.cpp:44:2: error: candidate is: template<class R, class ... P> static R derived::virtual_println_wrapper_function(base*, P&& ...)Grüße,
PI
-
Zuviel Code und die Makros machen das unleserlich.
Deshalb nur Allgemein:
Adresse einer Template Funktion bekommt man genauso wie bei einer "normalen" funktione:template<typename T> void foo(T) {} int main() { void (*i)(int) = foo<int>; i(1); void (*f)(float) = foo<float>; f(.1); }
-
Das habe ich vermutet. Aber ich suche schon seit 3 Stunden den Fehler und finde ihn nicht. Da zeige ich lieber meinen originalen Code, anstatt dann Tippfehler reinzubauen beim umbauen

Vielleicht hat ja trotzdem jemand die Muse sich dieses Gefrickel anzusehen

-
OT: Rechtschreibung
314159265358979 schrieb:
Vielleicht hat ja trotzdem jemand die Muse sich dieses Gefrickel anzusehen

Mit Muße bezeichnet man die Zeit, welche eine Person nach eigenem Wunsch nutzen kann, um sich zu erquicken und zu erbauen, etwa seiner Muse oder den Musen frönend.
(Das als Eröffnungssatz Wikipedia? Da hat mal jemand seinen Heinz Erhardt gesehen; sehr gut! Trotzdem finde ich es sehr löb- und verwunderlich für die deutsche Wikipedia. Es wird sicher bald verernsthaftet.)
-
Eigentlich meinte ich das andere Gefrickel

-
Okay, ich habs nun selbst gelöst, allerdings zum Preis des Perfect Forwardings...
#define VIRTUAL_FUNCTION_FAMILY(base, derived, name) \ template <typename R, typename... P> \ static R virtual_##name##_wrapper_function(base* obj, P... args) \ { \ return static_cast<derived*>(obj)->name(std::forward<P>(args)...); \ } #define VIRTUAL_INIT(base, name, r, ...) \ virtual_##name##_pf(pack<__VA_ARGS__>()) = &virtual_##name##_wrapper_function<r, __VA_ARGS__>;Jemand ne Idee, wie ich das hinkriege?
-
was willst du da eigentlich erreichen?
//edit ich habe gerade den anderen Thread gesehen. Oh mein Gott. Das kann ich nicht unterstützen.
-
Wieso nicht? Ich mach das doch nur zum Spaß
