Question

Cet article décrit un moyen de: C #, pour permettre l'ajout de types de valeur arbitraires pour lesquels un opérateur + est défini. En substance, il permet le code suivant:

public T Add(T val1, T val2)
{
   return val1 + val2;
}

Ce code ne compile pas car il n'y a aucune garantie que le type T ait une définition pour l'opérateur '+', mais l'effet est obtenu avec un code comme celui-ci:

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));
}

Suivez le lien pour voir comment la classe Num y parvient. Quoi qu'il en soit, passons à la question. Est-il possible d'obtenir le même effet en C ou C ++? Pour les curieux, le problème que je cherche à résoudre est de permettre à un noyau CUDA d’être plus flexible / général en lui permettant d’opérer sur plus de types.

Mise à jour: Pour .NET, Marc Gravell a créé un bibliothèque d’utilitaires qui résout le problème de l’opérateur de manière très élégante.

Était-ce utile?

La solution

En raison de la manière dont les modèles sont compilés en C ++, il suffit de faire:

template < class T >
T add(T const & val1, T const & val2)
{
    return val1 + val2;
}

fonctionnera, vous obtiendrez une erreur de compilation pour chaque type où un opérateur + n'est pas défini.

Les modèles C ++ génèrent du code pour chaque instanciation de type. Ainsi, pour chaque type de code, le code généré est correct. De cette façon, C ++ n’a pas besoin de Num & Lt; & Gt; ruse.

En clair, cela n’est pas possible à ma connaissance.

Autres conseils

En C ++, ce n'est tout simplement pas un problème. Le code, comme dans votre premier exemple, fonctionne s'il est traduit littéralement en C ++ (ETA: comme l'a fait Pieter), mais je ne peux penser à aucune situation où directement en utilisant + ne fonctionnerait pas. Vous cherchez une solution à un problème qui n'existe pas.

Cela peut facilement être réalisé en C ++ à l'aide de modèles:


template <typename T>
T Add(T val1, T val2)
{
  return val1 + val2;
}

Notez cependant que ce doit être défini dans un fichier d'en-tête et que vous souhaiterez probablement également passer les paramètres par référence const au lieu de par valeur.

Cela ne peut pas être fait du tout en C.

Cela peut également être fait en C, bien que je ne sois pas sûr que le problème soit résolu, avec une macro.

#define ADD(A,B) (A+B)

Modèles en C ++. En C, pas sans soucis et frais généraux.

template<typename T> 
T add(T x, T y)
{ 
    return x + y;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top