[template] template "template-argument"
-
template< typename T > class A {public: T a; }; template< typename T1, typename T2 > class B {public: T1 c; T2 d;}; int main() { B< A<double>, double> Test0; //funzt natürlich B< A<double>, float> Test1; //funzt natürlich auch, soll aber nicht! }wie kann ich sicherstellen, dass das verwendete template argument von T1 bei der klasse B den Typ T2 besitzt?
Wie muss ich dahingehend die template klasse anpassen.
Der erste Typ (T2) soll letztlich der container Typ von T1 sein.
Jedoch benötigt B explizit den T2 ebenfalls.Also Test1 soll gar nicht möglich sein...
edit: ups, hab da was vergessen
sorry, andrey
-
wie kann ich sicherstellen, dass T1 und T2 vom selben Typ sind?
T2 überall durch T1 ersetzen?
\edit ne, ich seh da grad, dass du doch nicht das sagst, was du willst... T2 soll also doch der container von T1 sein, das ist ja nicht "vom selben Typ"

\edit: weiß nicht genau, ob so etwas überhaupt geht...
zum beispiel: bei stl-containern ist es ja aus diesem grunde ebenfalls theoretisch möglich, irgendeine verkrüppelte template klasse zu erzeugen, indem man dem allocator einen anderen typ, als dem container selbst übergibt:vector<int, allocator<char>> mutilatedVector; //was spricht denn dagegen?in so einem fall gibts natürlich mächtig ärger... aber erst zur laufzeit

-
Du willst also den Container und den Typ mit dem der Container instanziiert wurde.
Die STL-Container haben alle ein typedef namens container::value_type
-
Lösung: 'B' privat machen (z.B. in einen Namensbereich 'impl' schmeißen) und eine öffentliche Metafunktion als Typenalias für B zur Verfügung stellen. Das ist gängige Praxis.
Also:
template <typename T> struct B { typedef typename impl::B<A<T>, T> Type; };
-
Lösong: template template parameter:
template<template <class, class> class C, class T> class foo { public: static void test() { std::cout << typeid(C<T, std::allocator<T> >).name() << std::endl; } };Doof ist bloss dass dabei default Parameter nichtmehr funktionieren, du musst also beim "template template parameter deklarieren" oben "class, class" schreiben, und beim Verwenden unten eben auch "T, std::allocator<T>".
-
Doof ist bloss dass dabei default Parameter nichtmehr funktionieren
jo, das ist in der tat schade.... :p
@OP: warum lässt du es nicht einfach so wie es ist, und passt einfach auf, dass du keinen offensichtlichen unsinn instanziiert? Also, ich meine, wenn die ganzen STL-container mit dieser macke gebaut sind, und bisher immer prima funktionieren, dann ist es doch okay, einfach zwei unabhängige typen zu nehmen...

-
Die STL Container sind mit dieser Macke gebaut da es damals AFAIK noch keine template template parameter gab.
-
oha... das hab ich nicht gewusst, ich dachte die entwickler wären einfach zu faul

\edit: aber ich meine trotzdem: kleine unbedeutende macke, solange der programmierer nicht versucht, das programm quasi absichtlich zu sabotieren, gibt es damit nie probleme, also was solls... klappt doch... hab noch nie gesehen, dass sich jemand über die STL-container deswegen beschwert hat...

[na jut, ich hab auch nicht allzuviel gesehen, aber immerhin :p ]
-
danke an alle!