es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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 o 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?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para permitir a los usuarios elegir entre memory::on_RAM o memory::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:

    option(USE_RAM_MEMORY "Usar memoria RAM para simulación" ON)
    

    Luego, en el archivo CMakeLists.txt, definir una bandera del compilador que corresponda a la política de memoria elegida:

    if(USE_RAM_MEMORY)
      add_definitions(-DRAM_MEMORY)
    else()
      add_definitions(-DDISK_MEMORY)
    endif()
    

    A continuación, modificar la clase de simulación para utilizar la política de memoria definida:

    #ifdef RAM_MEMORY
      using MemoryPolicy = memory::on_RAM;
    #elseif
      using MemoryPolicy = memory::on_disk;
    #endif
    
    template<typename memorypolicy="">
    class MyClass {
      // ...
    };
    

    Ahora, el usuario puede elegir entre la memoria RAM y la de disco estableciendo la opción USE_RAM_MEMORY al compilar el programa:

    cmake -DUSE_RAM_MEMORY=ON ..
    

    Esto establecerá la bandera del compilador RAM_MEMORY y configurará la clase de simulación para usar memory::on_RAM. Alternativamente, establecer USE_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.

Comments are closed.