Frage

Das Artikel rel="nofollow beschreibt eine Art und Weise, in C #, die Zugabe von beliebigen Wertetypen zu ermöglichen, die einen Operator + für sie definiert haben. Im Wesentlichen erlaubt es den folgenden Code:

public T Add(T val1, T val2)
{
   return val1 + val2;
}

Dieser Code kompiliert nicht, da es keine Garantie dafür gibt, dass der T-Typ eine Definition für den Operator ‚+‘ hat, aber der Effekt ist mit Code wie folgt erreicht werden:

public T Add(T val1, T val2)
{
   //Num<T> defines a '+' operation which returns a value of type T
   return (new Num<T>(val1) + new Num<T>(val2));
}

Folgen Sie den Link, um zu sehen, wie die Num-Klasse erreicht dies. Wie auch immer, auf die Frage. Gibt es einen Weg, um die gleiche Wirkung in C oder C ++ zu erreichen? Für die Neugierigen, ist das Problem, das ich zu lösen bin versucht, eine CUDA Kernel zu ermöglichen flexiblere / General zu sein, indem es auf mehr Arten betrieben werden.

Update: Für .NET Marc GRA hat eine Utility-Bibliothek , die sehr elegant den Betreiber Problem löst.

War es hilfreich?

Lösung

Durch die Art und Weise Vorlagen in C ++ kompiliert werden, einfach zu tun:

template < class T >
T add(T const & val1, T const & val2)
{
    return val1 + val2;
}

funktioniert, können Sie einen Compiler-Fehler für jede Art erhalten werden, wo ein Operator + nicht definiert ist.

C ++ Templates generieren Code für jede Instanziierung, so dass für jeden Typ T-Code erzeugt wird, der das Richtige tut. Auf diese Weise C ++ nicht braucht Num <> Betrügerei.

Im Klar C, ist dies nicht möglich ist, soweit ich weiß.

Andere Tipps

.

In C ++ ist dies einfach kein Thema Der Code wie in Ihrem ersten Beispiel funktioniert, wenn buchstäblich in C übersetzt ++ (ETA: wie Pieter tat), aber ich kann von jeder Situation nicht denken, wo direkt mit + nicht funktionieren würde. Sie suchen eine Lösung für ein Problem, das nicht existiert.

Dies kann leicht in C ++ durchgeführt wird mit Hilfe von Vorlagen:


template <typename T>
T Add(T val1, T val2)
{
  return val1 + val2;
}

Beachten Sie jedoch, dass dieses muss in einer Header-Datei definiert werden, und Sie wollen wahrscheinlich auch durch konstante Referenz, die Parameter zu übergeben, anstatt nach Wert.

Das kann nicht in Ebene C durchgeführt werden.

Es kann auch in C durchgeführt werden, obwohl ich nicht sicher bin, es die Problemanforderungen erfüllt, mit einem Makro.

#define ADD(A,B) (A+B)

Templates in C ++. In C, nicht ohne massiven Aufwand und Aufwand.

template<typename T> 
T add(T x, T y)
{ 
    return x + y;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top