Pregunta

Este artículo describe una manera, en C #, para permitir la adición de tipos de valores arbitrarios que tienen un operador + definido para ellos. En esencia, permite el siguiente código:

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

Este código no se compila ya que no hay garantía de que el tipo T tenga una definición para el operador '+', pero el efecto se logra con un código como este:

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

Siga el enlace para ver cómo la clase Num logra esto. De todos modos, a la pregunta. ¿Hay alguna forma de lograr el mismo efecto en C o C ++? Para los curiosos, el problema que estoy tratando de resolver es permitir que un núcleo CUDA sea más flexible / general al permitirle operar en más tipos.

Actualización: Para .NET, Marc Gravell ha realizado un biblioteca de utilidades que resuelve el problema del operador de manera muy elegante.

¿Fue útil?

Solución

Debido a la forma en que las plantillas se compilan en C ++, simplemente haciendo:

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

funcionará, obtendrá un error de compilación para cada tipo donde un operador + no está definido.

Las plantillas C ++ generan código para cada tipo de instanciación, por lo que para cada tipo de código T se generará lo que hace lo correcto. De esta manera, C ++ no necesita Num & Lt; & Gt; engaño.

En C simple, esto no es posible hasta donde yo sé.

Otros consejos

En C ++ esto simplemente no es un problema. El código como en su primer ejemplo funciona si se traduce literalmente a C ++ (ETA: como lo hizo Pieter), pero no puedo pensar en ninguna situación en la que directamente usando + no funcionaría. Estás buscando una solución a un problema que no existe.

Esto se puede hacer fácilmente en C ++ usando plantillas:


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

Tenga en cuenta, sin embargo, que este debe definirse en un archivo de encabezado, y probablemente también desee pasar los parámetros por referencia constante en lugar de por valor.

Esto no se puede hacer en C simple.

También se puede hacer en C, aunque no estoy seguro de que cumpla los requisitos del problema, con una Macro.

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

Plantillas en C ++. En C, no sin problemas y gastos generales masivos.

template<typename T> 
T add(T x, T y)
{ 
    return x + y;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top