c++ - example - nvidia gpu
Operaciones en tipos de valores arbitrarios (5)
Debido a la forma en que se compilan las plantillas en C ++, simplemente hacemos:
template < class T >
T add(T const & val1, T const & val2)
{
return val1 + val2;
}
funcionará, obtendrá un error de compilación para cada tipo en el que un operador + no está definido.
Las plantillas de C ++ generan código para cada instanciación de tipo, de modo que para cada tipo se generará un código T que haga lo correcto. De esta forma C ++ no necesita Num <> truco.
En la C simple, esto no es posible por lo que sé.
Este artículo describe una forma, 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 trato de resolver es permitir que un kernel de CUDA sea más flexible / general al permitir que opere en más tipos.
Actualización: para .NET, Marc Gravell ha creado una biblioteca de utilidades que resuelve el problema del operador de forma muy elegante.
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 esto debe definirse en un archivo de encabezado, y probablemente también quiera pasar los parámetros por const reference en lugar de por valor.
Esto no se puede hacer en absoluto C en absoluto.
Plantillas en C ++. En C, no sin molestias masivas y gastos generales.
template<typename T>
T add(T x, T y)
{
return x + y;
}
También se puede hacer en C, aunque no estoy seguro de que cumpla con los requisitos del problema, con una macro.
#define ADD(A,B) (A+B)
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 donde el uso directo de + no funcione. Está buscando una solución a un problema que no existe.