Entfernen von Top-Level const/ref bei Template verhindern
-
Hallo Leute!
Ich schreibe gerade ein Makro, das eine Variable Anzahl an Argumenten nimmt, die Variablen im Code sind. Innerhalb dieses Makros moechte ich jetzt eine Typliste generieren, die die Typen dieser Variablen enthaelt. Das sieht dann ungefaehr so aus:
template <typename... Args> typelist<Args...> deduce(Args...); #define TYPES_OF(...) decltype(deduce(__VA_ARGS__))Das Problem ist aber, dass dabei Top-Level const/refs bei deduce einfach weggeschmissen werden. Und da man __VA_ARGS__ auch nicht expandieren kann, wie man es mit Variadic Templates kann, kann ich auch nicht einfach decltype(__VA_ARGS__) schreiben o.ae.
Hat da jemand eine Idee?
Gruesse,
Der Kellerautomat
-
Ich seh den Sinn nicht so ganz. Zeig doch mal, wie du das dann benutzen wollen würdest.
Durch deduce(Args&&...) bei der Deklaration von deduce behält man noch die constness und die Art der Wertkategorie, also ob es ein Lvalue oder Rvalueausdruck war, so dass
int i=2; const double pi = 3.14159265; TYPES_OF(i,pi,i+pi)types<int&,const double&,double> liefern würde.
-
Oh man, ich bin auch doof. Ich hatte zuerst eine RValue Referenz drin, aber typeid(), das ich zur Ausgabe des Typen verwendet habe, streicht ja offenbar Top-Level immer weg.

Ich brauche das fuer Compiletime-Reflection. Ich hab das Beispiel nur aufs noetigste vereinfacht. Die uebergebenen Variablen sind in Wirklichkeit Member des zu inspizierenden Typs.
#define CTR_REFLECT_INFO(t, b, m) \ namespace ctr \ { \ template <> \ struct reflect<t> : t \ { \ static constexpr char full_name[] = #t; \ typedef typelist<b> bases; \ typedef decltype(deduce(m)) members; \ }; \ \ constexpr char reflect<t>::full_name[]; \ }struct foo { int const i; }; struct bar : foo { int p, q; }; CTR_REFLECT_INFO(::foo, CTR_BASES(), CTR_MEMBERS(i)) CTR_REFLECT_INFO(::bar, CTR_BASES(foo), CTR_MEMBERS(p, q)):p