Je suis fan de types fantômes, et j'en colle partout (trop?). Mais quand je fais du C++ en lieu et place d'OCaml, je m'assure de toujours avoir dans un coin ma template StrongId:
template<typename DISCRIMINANT, typename TYPE>
class StrongId
{
public:
StrongId(const TYPE & type):
_type(type)
{
}
bool operator==(const StrongId<DISCRIMINANT, TYPE> & other)
{
return _type == other._type;
}
TYPE _type;
};
class DistanceDiscriminant;
class TempsDiscriminant;
typedef StrongId<DistanceDiscriminant, int> DistanceT;
typedef StrongId<TempsDiscriminant, int> TempsT;
int main()
{
DistanceT d1(1);
DistanceT d2(2);
d1 == d2;
TempsT t1(1);
d1 == t1; // Erreur de compile
}
Il est ensuite possible d'ajouter des méthodes supplémentaires pour comparer, sérialiser, afficher… Voire de rajouter un peu de template magic pour permettre de diviser une distance par un temps et d'obtenir une vitesse.
# En C++...
Posté par small_duck (site web personnel) . En réponse au journal Les types fantômes. Évalué à 9.
Je suis fan de types fantômes, et j'en colle partout (trop?). Mais quand je fais du C++ en lieu et place d'OCaml, je m'assure de toujours avoir dans un coin ma template StrongId:
Il est ensuite possible d'ajouter des méthodes supplémentaires pour comparer, sérialiser, afficher… Voire de rajouter un peu de template magic pour permettre de diviser une distance par un temps et d'obtenir une vitesse.