2012-02-10 13 views
5

En primer lugar, no estoy realmente teniendo un problema, pero me gusta mantener las cosas lo más simples posible. Estoy usando una clase de plantilla llamada Math y además de muchas otras cosas, hay funciones aleatorias.Función estática no templada en la clase de plantilla

Diferentes tipos de funciones aleatorias, y una función para establecer la semilla aleatoria. Entonces, cada función excepto la función de inicialización usa el tipo class Real. Pero cuando quiero fijar la semilla tengo que pasar algún aleatorio (jaja) Tipo de poder llamar a la función:

Math<u32>::SeedRandom(System::time()); 

De nuevo, esto no es un problema real, pero tengo curiosidad si es posible Obtenga el mismo resultado sin la necesidad de usar el <u32>.

Aquí un fragmento de la clase Math:

template <class Real> 
class Math 
{ 
public: 
    static void SeedRandom(u32 seed) { srand(seed); } 
    static Real UnitRandom() { return (Real)((f64)rand()/(f64)RAND_MAX); } 
}; 

por cierto. f64 es typedef'd a double y u32 a unsigned int.

Respuesta

4

Las funciones estáticas deben llamarse al ClassName::FunctionName. Como ClassName es una plantilla, usted tiene que especificar argumentos de plantilla. También se pueden invocar funciones estáticas en un objeto, es decir, object.StaticFunctionName, de modo que si ya tiene un objeto, puede evitar especificar argumentos de plantilla, pero en mi opinión personal sesgada llamar a una función estática en un objeto es feo.

Lo que haría si fuera usted es hacer que la función no sea miembro (amigo de la plantilla, si es necesario), en el mismo espacio de nombres que su clase.

+0

Sí, un objeto singleton para llamar a esa función sería posible, pero en ese caso sería realmente feo :) Solo quería saber si hay una forma de codificarlo, así que no hay necesidad de especificar el tipo. Lo intenté un poco y es posible llamarlo así 'Math :: SeedRandom ((u32) System :: time());'. Esto al menos mostraría que el tipo no se usa, pero solo hace que el tiempo de compilación sea innecesariamente más largo, y es aún más feo que llamar con ''. – v01pe

+0

@ v01pe: el uso de 'void *' en mi opinión sesgada pervertida no implicaría de ninguna manera que el tipo no se use. IMO, como ya he indicado, la función independiente es la mejor solución. Las funciones autónomas NO contradicen de ninguna manera el paradigma de OOP en C++ –

+0

Por supuesto que tiene razón, ¡usar 'void *' no implica eso! – v01pe

2

No hay manera de hacer que la función se pueda llamar como Math::SeedRandom (excepto que se haga Math sin plantilla, por supuesto). Lo mejor que puedes hacer es mover SeedRandom a una clase separada sin plantilla o simplemente vivir llamándolo como Math<whatever>::SeedRandom.

+0

Quiero mantenerlo en la misma clase que las funciones aleatorias, pero gracias por señalar que no es posible a la inversa. – v01pe

0

Soy muy escéptico de una clase llamada "Matemáticas" porque me resulta difícil imaginar una instancia de "Matemáticas". Por los sonidos que tiene, es posible que desee utilizar un espacio de nombres con algunas funciones gratuitas de plantilla. Que tengas este problema puede ser una señal de que quizás no deberías estar haciendo lo que estás haciendo.

C++ es un lenguaje multi-paradigma, y ​​como tal no obliga a todo a ser parte de un objeto, a diferencia de los lenguajes como Java.

+0

La cuestión es que la clase también contiene algunos 'const's con plantillas, que se usan dentro de las funciones.Además, la función mencionada anteriormente es la única función que no necesita la plantilla. Soy consciente de que no es la mejor manera posible de hacer esto, y migth refactorizarlo algún día, pero por ahora cumple perfectamente su propósito. – v01pe

Cuestiones relacionadas