Tengo algunas funciones que se pueden agrupar pero que no pertenecen a ningún objeto/entidad y, por lo tanto, no se pueden tratar como métodos.C++ Espacios de nombres y plantillas
Así que, básicamente en esta situación, crearía un nuevo espacio de nombres y pondría las definiciones en un archivo header
, la implementación en el archivo cpp
. También (si es necesario) crearía un espacio de nombre anónimo en ese archivo cpp
y pondría todas las funciones adicionales que no tienen que estar expuestas/incluidas en la interfaz de mi espacio de nombres allí.
ver el código de abajo (probablemente no es el mejor ejemplo y se podría hacer mejor con otro programa de arquitectura, pero simplemente no puedo pensar en una muestra mejor ...)
Código de la muestra (header
)
namespace algorithm {
void HandleCollision(Object* object1, Object* object2);
}
código de la muestra (cpp
)
#include "header"
// Anonymous namespace that wraps
// routines that are used inside 'algorithm' methods
// but don't have to be exposed
namespace {
void RefractObject(Object* object1) {
// Do something with that object
// (...)
}
}
namespace algorithm {
void HandleCollision(Object* object1, Object* object2) {
if (...) RefractObject(object1);
}
}
Hasta ahora todo bien. Supongo que esta es una buena manera de administrar mi código, pero no sé qué debería hacer si tengo algunas funciones basadas en plantillas y quiero hacer básicamente lo mismo.
Si uso plantillas, tengo que poner todo mi código en el archivo header
. Bien, pero ¿cómo debería ocultar algunos detalles de implementación?
Quiero ocultar RefractObject
función de mi interfaz, pero no puedo simplemente retire su declaración (sólo porque tengo todo mi código en un archivo header
) ...
El único enfoque que se me ocurrió fue algo así como:
código de la muestra (header
)
namespace algorithm {
// Is still exposed as a part of interface!
namespace impl {
template <typename T>
void RefractObject(T* object1) {
// Do something with that object
// (...)
}
}
template <typename T, typename Y>
void HandleCollision(T* object1, Y* object2) {
impl::RefractObject(object1);
// Another stuff
}
}
Alguna idea de cómo hacer esto mejor en términos de diseño de código?
Miembro de lo que también, las funciones libres son preferidas de todos modos :) – GManNickG
Bueno, he dicho que esto es solo por muestra. En el caso de mi proyecto real, 'algorithm' incluye algoritmos de aproximación y algoritmos de búsqueda de rutas, por lo que es simplemente imposible hacerlos' members' en el significado de esa palabra ... –
funciones miembro> funciones gratuitas desde la invención de Intellisense. – Puppy