Operationen auf beliebigen Wert Typen
-
03-07-2019 - |
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.
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;
}