Template-Konstruktor einer Template-Klasse
-
Hallo,
wie kann ich die Template-Parameter eines Konstruktors einer Template-Klasse explizit angeben?Also als Quelltext
template <typename T> struct A { template<typename S> A(S s){ } }; ... // Wie hier die Template-Paramter explizit angeben? A<int> a(std::string("hallo"));Danke im Voraus
-
template <typename T, typename S> struct A { A(const S& s) : m_s(s) {} private: S m_s; T m_t; };...
-
ich habe schon meine Gründe warum der Konstruktor ebenfalls mit templates parametrisiert wird.
Dein Vorschlag ist dazu leider nicht brauchbar.Edit:
Ich will auch keine Workarounds als Lösungen haben. Da ich für meine Anforderungen die Parameter (hoffentlich) nie explizit angeben muss. Und ich Workarounds dazu gefunden habe. Die Frage ist rein theoretisch.
-
matimatiker schrieb:
Hallo,
wie kann ich die Template-Parameter eines Konstruktors einer Template-Klasse explizit angeben?Also als Quelltext
template <typename T> struct A { template<typename S> A(S s) : s_(s) { } S s_; };Das geht nicht, schließlich benutzt Du S nicht nur in der Templatefunktion, sondern auch in der Klasse, die mit der Templatefunktion nichts zu tun hat. Die Klasse ist damit ebenfalls von S abhängig, entsprechend kannst Du ausschließlich nach (D)evils Code vorgehen.
Darf ich fragen, welchen theoretischen Gedanken Du verfolgst?
matimatiker schrieb:
// Wie hier die Template-Paramter explizit angeben? A<int> a(std::string(hallo));Entweder verstehe ich nicht, was du willst, oder Du widersprichst Dir selbst?
Dein Konstruktor soll int haben und Du verpasst ihm einen String?
-
Xin schrieb:
matimatiker schrieb:
Hallo,
wie kann ich die Template-Parameter eines Konstruktors einer Template-Klasse explizit angeben?Also als Quelltext
template <typename T> struct A { template<typename S> A(S s) : s_(s) { } S s_; };Das geht nicht.
Jo, bin müde. Habs nicht gesehen. Werde gleich korrigieren.
Darf ich fragen, welchen theoretischen Gedanken Du verfolgst?
Klar darfst du.
Schreibe eine Funktor-Klasse die sowohl Funktionspointer als auch Methoden-pointer unterstützt. Da ich für letzteres keine neue Klasse schreiben will. Muss ich einen Konstruktor anbieten, der den Typ des Objektes auf den Methodenpointer kennt. Dazu ist das notwendig. Bin jetzt wie gesagt zu müde & faul den Quelltext dazu zu posten.
Entweder verstehe ich nicht, was du willst, oder Du widersprichst Dir selbst?
Dein Konstruktor soll int haben und Du verpasst ihm einen String?Ich habe nirgendwo geschrieben, dass der Konstruktor int haben soll. Der Muss schon den String erhalten. (Wobei natürlich int auch nicht verboten ist)
andersgesagt, int ist der Paramter der Klasse. std::string wird in diesem Fall implizit als Templateparameter des Konstruktors verwendet. Ich möchte den Parameter aber explizit angeben können.
Also soetwas wie:A<int> a<std::string>("hallo");Das geht aber so nicht.
-
einfache Lösung: das geht nicht. du kannst keine template parameter im constructor explizit angeben.
-
Das sollte auch garnicht nötig sein da der Compiler die Template-Parameter von Methoden selbst herleiten kann. Sowas ist ja bei Sequenzkonstruktoren nicht ungewöhnlich. Im Notfall musst Du halt (z.B.) das Stringliteral auf std::string casten.
A<int> a( std::string("hallo") );BTW: Mit Sequenzkonstruktor meine ich sowas wie
template< typename A > struct vector { template< typename Iter > vector( Iter first, Iter last ); };
-
LordJaxom schrieb:
Das sollte auch garnicht nötig sein da der Compiler die Template-Parameter von Methoden selbst herleiten kann.
Noetig waere es schon.
class F { template<typename T> F(T t) : t(t) {} T t; }; Foo f(1);waere sehr schoen.
aber wie otze sagt: geht nicht.
-
Schade. Ist das compilertechnisch schwer umzusetzen?
Von der Schreibweise kam mir da F f = F::F<string>("asdf") in den Sinn. Sieht für mich, als ahnungslosen compilerbauer, eigentlich nicht nach großen Aufwand aus.Oder wurde an den Fall einfach nicht gedacht?