Operazioni su tipi di valore arbitrari
-
03-07-2019 - |
Domanda
Questo articolo descrive un modo, in C #, per consentire l'aggiunta di tipi di valore arbitrari per i quali è stato definito un operatore +. In sostanza, consente il seguente codice:
public T Add(T val1, T val2)
{
return val1 + val2;
}
Questo codice non viene compilato in quanto non esiste alcuna garanzia che il tipo T abbia una definizione per l'operatore '+', ma l'effetto si ottiene con un codice come questo:
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));
}
Segui il link per vedere come la classe Num raggiunge questo obiettivo. Comunque, alla domanda. Esiste un modo per ottenere lo stesso effetto in C o C ++? Per i curiosi, il problema che sto cercando di risolvere è consentire a un kernel CUDA di essere più flessibile / generale consentendogli di operare su più tipi.
Aggiornamento: per .NET, Marc Gravell ha realizzato un libreria di utilità che risolve il problema dell'operatore in modo molto elegante.
Soluzione
A causa del modo in cui i modelli sono compilati in C ++, semplicemente:
template < class T >
T add(T const & val1, T const & val2)
{
return val1 + val2;
}
funzionerà, otterrai un errore di compilazione per ogni tipo in cui un operatore + non è definito.
I modelli C ++ generano codice per ogni istanza di tipo, quindi per ogni tipo di codice T verrà generato che fa la cosa giusta. In questo modo C ++ non ha bisogno di Num & Lt; & Gt; inganno.
Nella semplice C, questo non è possibile per quanto ne so.
Altri suggerimenti
In C ++ questo non è semplicemente un problema. Il codice come nel tuo primo esempio funziona se tradotto letteralmente in C ++ (ETA: come ha fatto Pieter), ma non riesco a pensare a nessuna situazione in cui usare direttamente + non funzionerebbe. Stai cercando una soluzione a un problema che non esiste.
Questo può essere fatto facilmente in C ++ usando template:
template <typename T>
T Add(T val1, T val2)
{
return val1 + val2;
}
Si noti, tuttavia, che questo deve essere definito in un file di intestazione e che probabilmente si desidera anche passare i parametri per riferimento const anziché per valore.
Questo non può essere fatto nella semplice C
Può essere fatto anche in C, anche se non sono sicuro che soddisfi i requisiti del problema, con una Macro.
#define ADD(A,B) (A+B)
Modelli in C ++. In C, non senza enormi problemi e spese generali.
template<typename T>
T add(T x, T y)
{
return x + y;
}