2 QVariant von unbekanntem aber gleichem Typ vergleichen

Alles rund um die Programmierung mit Qt
Antworten
dermoritz
Beiträge: 21
Registriert: 27. April 2009 09:37

2 QVariant von unbekanntem aber gleichem Typ vergleichen

Beitrag 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.

Code: Alles auswählen

variant.value<int>() <= variant.value<int>()
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).
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Da QVariant nahezu jeden Datentyp unterstützt, aber nicht jeder Datentyp jede Vergleichsfunktion jede Vergleichsfunktion hat, kann QVariant dies auch nicht anbieten.
dermoritz
Beiträge: 21
Registriert: 27. April 2009 09:37

Beitrag 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.
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag 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)
dermoritz
Beiträge: 21
Registriert: 27. April 2009 09:37

Beitrag 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 ;-)
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

verständlich... wollt nur zeigen das es ginge.... ;-)
Antworten