template template und Zeiger Parameter

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
kaiserludi
Establishment
Beiträge: 467
Registriert: 18.04.2002, 15:31

template template und Zeiger Parameter

Beitrag von kaiserludi »

Ich habe folgendes Template:

Code: Alles auswählen

template<typename EType> struct NestedInfos{};
Dazu habe ich folgende template template Spezialisierung dafür:

Code: Alles auswählen

template<template<typename, typename> class EType, typename ENestedKeyType, typename ENestedValueType> struct NestedInfos<EType<ENestedKeyType, ENestedValueType> >{};
Wenn ich nun etwas wie NestedInfos<Dictionary<int, int> > schreibe, dann wird auch wie gewünscht das Template Template aufgerufen.
Bei NestedInfos<Dictionary<int, int>*> hingegen wird statt dem Template Template die template<typename EType> Version aufgerufen.

Lege ich nun eine explizite Spezialisierung für Zeigertypen für das Template Template an, so wie hier:

Code: Alles auswählen

template<template<typename, typename> class EType, typename ENestedKeyType, typename ENestedValueType> struct NestedInfos<EType<ENestedKeyType, ENestedValueType>*>{};
dann wird im NestedInfos<Dictionary<int, int>*> Fall diese auch benutzt.

Warum muss ich denn hier explizit für Zeiger spezialisieren, damit für einen Template mit korrekter Anzahl Templateparrameter als Parameter auch eine Template Tempalte Version genutzt wird?
In Abwesenheit der Zeigerspezialisierung sollte doch das verbliebene Template Template klar am besten passen?
"Mir ist auch klar, dass der Tag, an dem ZFX und Developia zusammengehen werden der selbe Tag sein wird, an dem DirectGL rauskommt."
DirectGL, endlich ist es da
:)

"According to the C++ standard, it's "undefined". That's a technical term that means, in theory, anything can happen: the program can crash, or keep running but generate garbage results, or send Bjarne Stroustrup an e-mail saying how ugly you are and how funny your mother dresses you." :shock:[/size]
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: template template und Zeiger Parameter

Beitrag von CodingCat »

Nein im Gegenteil, die Template-Template-Version kann für Zeiger überhaupt nicht passen. T und T* sind grundverschiedene Typen, das eine ist ein beliebiger Wertetyp, das andere ein Zeiger auf denselben. Nur weil es eine Spezialisierung für T gibt, kann der Compiler nicht einfach den Zeiger in T* verschlucken und so tun, als wäre nur ein T übergeben worden. Abhilfe kann folgendes schaffen:

Code: Alles auswählen

template <
    typename EType,
    typename = typename std::remove_pointer<EType>::type >
struct NestedInfos { ... };

template <
    typename EType,
    template<typename, typename> class ETemplate, typename ENestedKeyType, typename ENestedValueType >
struct NestedInfos< EType, ETemplate<ENestedKeyType, ENestedValueType> > { ... };
Ich werde das Gefühl nicht los, dass du da eine undurchdringliche Template-Hölle aufbaust. ;)
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
kaiserludi
Establishment
Beiträge: 467
Registriert: 18.04.2002, 15:31

Re: template template und Zeiger Parameter

Beitrag von kaiserludi »

Ja, mit deiner Modifikation funktioniert das ganze auch ohne Pointerspezialisierung :)
CodingCat hat geschrieben: Ich werde das Gefühl nicht los, dass du da eine undurchdringliche Template-Hölle aufbaust. ;)
*diabolisches Lachen* Wer ich? Aber nein, ich bin ganz lieb. :mrgreen:

Im Ernst: Solange ich durch den Code durchsteige, tust du das mit deinem Teplateverständnis sogar ohne Einarbeitung.

Die ganzen Templates sind auch alle schön in der Implementation versteckt und dienen vor allem dazu, die API dafür umso einfach verständlich zu halten.

Hier mal ein Beispiel für ein Hashtable mit einem Dictionary<Dictionary<int, int*> > als Value:

Code: Alles auswählen

Hashtable ev;
Dictionary<int, Dictionary<int, int*>*> outerDic;
Dictionary<int, int*> innerDic;
int test = 3;
innerDic.put(2, &test, 1);
outerDic.put(1, &innerDic, 1);
ev.put(L"dic", outerDic);
Viel durchdringlicher kann man diesen Templatehimmel doch gar nicht mehr gestalten ;)
"Mir ist auch klar, dass der Tag, an dem ZFX und Developia zusammengehen werden der selbe Tag sein wird, an dem DirectGL rauskommt."
DirectGL, endlich ist es da
:)

"According to the C++ standard, it's "undefined". That's a technical term that means, in theory, anything can happen: the program can crash, or keep running but generate garbage results, or send Bjarne Stroustrup an e-mail saying how ugly you are and how funny your mother dresses you." :shock:[/size]
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: template template und Zeiger Parameter

Beitrag von dot »

Was ich mich bisher in jedem deiner Threads, wo es um das ging, gefragt hab: Warum speichert das Dictionary Pointer auf Dictionaries und nicht einfach direkt Dictionaries!?
kaiserludi
Establishment
Beiträge: 467
Registriert: 18.04.2002, 15:31

Re: template template und Zeiger Parameter

Beitrag von kaiserludi »

Man kann auch direkt Dictionaries speichern, aber eben auch (optional multidimensionale) CArrays von Dictionaries per Pointer auf das erste Element.
Es gibt quasi folgende 3 Möglichkeiten:

Code: Alles auswählen

dic.put(key, myDic);
dic.put(key, mySingleDimensionalDicArray, arraySize);
di.cput(key, myMutidimensionalDicArray, array1DHoldingTheArraySizesForAllDimenions);
"Mir ist auch klar, dass der Tag, an dem ZFX und Developia zusammengehen werden der selbe Tag sein wird, an dem DirectGL rauskommt."
DirectGL, endlich ist es da
:)

"According to the C++ standard, it's "undefined". That's a technical term that means, in theory, anything can happen: the program can crash, or keep running but generate garbage results, or send Bjarne Stroustrup an e-mail saying how ugly you are and how funny your mother dresses you." :shock:[/size]
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: template template und Zeiger Parameter

Beitrag von CodingCat »

Yo dawg, we herd you like dictionaries, so we put a multi-dimensional array of dictionaries in yo dictionary so you can look up while you look up. :lol:
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
kaiserludi
Establishment
Beiträge: 467
Registriert: 18.04.2002, 15:31

Re: template template und Zeiger Parameter

Beitrag von kaiserludi »

Du lachst, aber der Grund, warum wir das einbauen, ist, dass immer wieder Kunden danach fragen.
"Mir ist auch klar, dass der Tag, an dem ZFX und Developia zusammengehen werden der selbe Tag sein wird, an dem DirectGL rauskommt."
DirectGL, endlich ist es da
:)

"According to the C++ standard, it's "undefined". That's a technical term that means, in theory, anything can happen: the program can crash, or keep running but generate garbage results, or send Bjarne Stroustrup an e-mail saying how ugly you are and how funny your mother dresses you." :shock:[/size]
Antworten