Seite 1 von 1
2 QVariant von unbekanntem aber gleichem Typ vergleichen
Verfasst: 22. Mai 2009 13:46
von dermoritz
ich möchte gerne 2 QVariants miteinander vergleichen deren QVariant::Type identisch ist. Das Problem ist ich komme nicht an die Werte ran ohne einen konkreten Typ T anzugeben, wie z.b.
gibt es irgendeine möglichkeit die ohne die Angabe von int zu erreichen, z.b. über die angabe variant.type()?
oder eventuell über die data() funktion (die gibt einen pointer auf die daten zurück).
Verfasst: 22. Mai 2009 14:52
von upsala
Da QVariant nahezu jeden Datentyp unterstützt, aber nicht jeder Datentyp jede Vergleichsfunktion jede Vergleichsfunktion hat, kann QVariant dies auch nicht anbieten.
Verfasst: 25. Mai 2009 11:55
von dermoritz
es ginge schon, in dem z.b. falls der operator fehlt prinzipiell false zurückgeben wird. aber es könnte auch eine exception geworfen werden falls der operator fehlt. die könnte man dann selbst fangen.
anderrerseits gilt dein argument auch für template typen. in meinem beispiel ist es "int". Man könnte da aber auch einen Typen angeben für den es keine Vergleichsoperatoren gibt. oder?
Das Problem ist, man kann sich den "enum type" von einem qvarinat geben lassen, aber man kann ihn nicht für die Funktion value() benutzen.
Verfasst: 25. Mai 2009 12:58
von AuE
Kannst dir auch deinen eigenen Datentypbauen. Templateklasse mit ner templatemethode welche du ja auch spezialisieren kannst
pezialisierung bei Funktionstemplates [Bearbeiten]
Im Unterschied zu Klassentemplates sind Funktionstemplates nicht teilweise (nur vollständig) spezialisierbar. Allerdings wird von der Spezialisierung von Funktionstemplates allgemein abgeraten, da die Regeln für die Bestimmung der „am besten passenden“ Funktion sonst zu unintuitiven Ergebnissen führen können (siehe [1]).
Durch Überladen von Funktionstemplates mit anderen Funktionstemplates kann man in den meisten Fällen das Gleiche erreichen wie durch die (nicht zulässige) teilweise Spezialisierung. Falls diese Technik aus jedwedem Grund im konkreten Fall nicht anwendbar ist – z. B. wenn ein Template von Klassenmethoden spezialisiert werden soll ohne die Klassendefinition zu erweitern – so kann man auch das Problem der Spezialisierung auf ein Template einer Hilfsklasse verlagern:
Code: Alles auswählen
class Example
{
private:
template< typename T >
struct Frobnicator
{
static T do_frobnicate(T param);
};
public:
template< typename T >
T frobnicate(T param);
};
template< typename T >
T Example::frobnicate(T param)
{
// Frobnicator soll die eigentliche Arbeit verrichten
return Frobnicator<T>::do_frobnicate(param);
}
template< typename T >
T Example::Frobnicator<T>::do_frobnicate(T param)
{
// Standardimplementierung ...
}
template<>
int Example::Frobnicator<int>::do_frobnicate(int param)
{
// ints werden auf andere Weise "frobnifiziert"
return (param << 3) + (param % 7) - param + foobar;
}
http://de.wikipedia.org/wiki/Template_(Programmierung)
Verfasst: 25. Mai 2009 13:22
von dermoritz
die motivation QVariant zu verwenden war eigentlich, sich keine eigenen template(hilfs)klassen machen zu müssen

.
in meinem Fall ist es nicht so kritischt - es gibt genau 2 Typen - per if case kann ich entsprechend verfahren. Aber komplett "typ-abstrakt" zu bleiben wäre irgendwie eleganter. im moment aber nicht elegant genug um mehr aufwand reinzustecken

Verfasst: 25. Mai 2009 13:34
von AuE
verständlich... wollt nur zeigen das es ginge....
