Diseño de clases de política: cómo agregar una opción CMake seleccionando la clase deseada.
Escribí las siguientes características que definen algunas clases de políticas:
namespace memory
{
struct on_RAM
{
template
using pop_sizes_type = PopulationSizeOnRAMImplementation
template<typename t="">
using flow_type = FlowOnRAMImplementation<t>;
};
struct on_disk
{
template<typename t="">
using pop_sizes_type = PopulationSizeOnDiskImplementation<t>;
template<typename t="">
using flow_type = FlowOnDiskImplementation<t>;
};
} // fin del namespace memory
Utilizo estas características para configurar el comportamiento de una clase de simulación: MyClass
Todo funciona bien, pero me gustaría que los usuarios de los programas resultantes puedan elegir una u otra alternativa sin tener que modificar el código fuente.
Supongo que puedo pedirles que sobrescriban una implementación predeterminada dando una opción a CMake, que podría dar eso al compilador, que podría hacer alguna elección en tiempo de compilación. Pero no tengo idea de cómo implementarlo técnicamente. ¿Alguna sugerencia?
davy.ai
Para permitir a los usuarios elegir entre
memory::on_RAM
omemory::on_disk
sin modificar el código fuente, un enfoque es utilizar variables CMake y configurar la clase de simulación mediante bloques#ifdef
en el código.Primero, definir una variable CMake que los usuarios puedan establecer para elegir la política de memoria:
Luego, en el archivo CMakeLists.txt, definir una bandera del compilador que corresponda a la política de memoria elegida:
A continuación, modificar la clase de simulación para utilizar la política de memoria definida:
Ahora, el usuario puede elegir entre la memoria RAM y la de disco estableciendo la opción
USE_RAM_MEMORY
al compilar el programa:Esto establecerá la bandera del compilador
RAM_MEMORY
y configurará la clase de simulación para usarmemory::on_RAM
. Alternativamente, establecerUSE_RAM_MEMORY=OFF
utilizarámemory::on_disk
.Tenga en cuenta que este enfoque requiere que la clase de simulación se vuelva a compilar al cambiar entre políticas de memoria, ya que
MEMORY_POLICY
se define en tiempo de compilación.