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.

È stato utile?

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top