Bedrywighede op arbitrêre waarde tipes
-
03-07-2019 - |
Vra
Hierdie artikel beskryf'n manier, in C#, toelaat dat die toevoeging van arbitrêre waarde tipes wat'n + operateur gedefinieer vir hulle.In wese is dit kan die volgende kode:
public T Add(T val1, T val2)
{
return val1 + val2;
}
Hierdie kode nie stel as daar is geen waarborg dat die T-tipe het'n definisie vir die ' + ' - operateur, maar die effek is bereik met'n kode soos hierdie:
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));
}
Volg die skakel om te sien hoe die Num klas bereik.In elk geval, op die vraag.Is daar enige manier om dieselfde effek te bereik in C of C++?Vir die vreemde, die probleem wat ek probeer om op te los is om toelaat dat'n CUDA kern te wees meer buigsaam/general deur toe te laat dit om te werk op meer tipes.
Update: Vir .NETTO, Marc Gravell het'n nut biblioteek wat los die operateur probleem baie elegant.
Oplossing
As gevolg van die manier templates is saamgestel in C ++, eenvoudig doen:
template < class T >
T add(T const & val1, T const & val2)
{
return val1 + val2;
}
will work, jy sal 'n Stel fout kry vir elke tipe waar 'n operateur + nie gedefinieer word.
C ++ templates genereer kode vir elke tipe Instantiëring, so vir elke tipe T-kode sal gegenereer word wat die regte ding doen. Op hierdie manier C ++ hoef nie Num <> kullery.
In plain C, dit is nie moontlik so ver as wat ek weet.
Ander wenke
In C++ dit is eenvoudig nie'n probleem. Die kode in jou eerste monster werk as letterlik vertaal in C++ (ETA:as Pieter het), maar ek kan nie dink aan enige situasie waar direk met behulp van + sal nie werk nie.Is jy op soek vir'n oplossing vir'n probleem wat nie bestaan nie.
Dit kan maklik gedoen word in C ++ maatvorms gebruik:
template <typename T>
T Add(T val1, T val2)
{
return val1 + val2;
}
Let egter daarop dat hierdie moet word gedefinieer in 'n kop-lêer, en jy waarskynlik wil ook die parameters slaag deur konst verwysing in plaas van deur waarde.
Dit kan nie gedoen word in 'n plat C at all.
Dit kan gedoen word in C sowel, maar ek is nie seker of dit voldoen aan die probleem vereistes, met 'n Makro.
#define ADD(A,B) (A+B)
Templates in C ++. In C, nie sonder massiewe moeite en oorhoofse.
template<typename T>
T add(T x, T y)
{
return x + y;
}