Sto provando a scrivere classi che gestiscono diversi tipi di numeri. So che C# (e .Net, in generale, credo) non ha alcuna interfaccia INumber
, quindi non posso usare qualcosa di simile al seguente:Come posso scrivere una singola classe per compilare più volte con diversi tipi di numeri?
public class Adder<T> where T:INumber
{
public T Add(T a, T b)
{
return a + b;
}
}
va bene così, però, perché mi piacerebbe evitare la boxe/unboxing di ognuno dei miei numeri. Potrei, tuttavia, utilizzare la compilazione condizionale per ogni tipo Voglio sostenere:
#if FLOAT
public class AdderF
{
public float Add(float a, float b)
#else
public class Adder
{
public int Add(int a, int b)
#endif
{
return a + b;
}
}
Ciò significa che avrò bisogno di compilare un diverso Library.dll
e LibraryF.dll
, tuttavia. C'è una soluzione più elegante a questo?
Ovviamente, nel mio esempio, posso semplicemente scrivere il codice due volte. Vorrei utilizzare questo processo, tuttavia, per creare grandi strutture dati complesse con una versione intera e una versione a virgola mobile, quindi non voglio la possibilità di errori di copia-incolla quando aggiorno la mia struttura. Né voglio che la perdita di velocità avvolga la struttura a virgola mobile in un wrapper integrale e converta inutilmente tutti gli input nel tipo di dati più sfavorevole.
Come ho detto, sto cercando di convincere più prestazioni dalle mie strutture dati, e non lo faccio Penso che usare 'decimal's dappertutto quando potrei usare' int's invece sarebbe efficace per quello. T4 è sicuramente una tecnologia interessante di cui non ero a conoscenza e sicuramente la esaminerò! – dlras2