Fichier contenant la class singleton template Factory, à qui on peut associer diverses classes constructibles à partir d'un nom sous forme de chaîne de caractères.
**/
#ifndef FACTORY_HPP
#define FACTORY_HPP
#include<unordered_map>
#include<memory>
#include<vector>
#include<type_traits>
/**
\class Factory
\brief Représente une fabrique fabriquant des objets de classe mère Base
Cette classe permet de lister l'ensemble des objects constructibles par cette dernière, ainsi que la construction d'un objet à partir d'un nom.
**/
template<typenameBase>
classFactory
{
template<typename_Base,typenameChild>
friendboolregister_to_factory();
public:
//! \brief Retourne un objet créé à partir de choice
//!
//! Fabrique un objet du type représenté par choice.
//! \param choice Le nom de la classe à fabriqué, tel que présent dans la liste retournée par list_choices().
//! \return Un unique_pointer de type Base pointant vers l'objet construit, ou nullptr si choice est invalide.
//! \brief Ajoute la classe child à la liste des objets fabriquables par Factory<base>.
//!
//! \param base La classe de base de child.
//! \param child Le type de classe dérivée de base que la fabrique devra pouvoir construire.
//! Ajoute la classe child à la liste des objets fabriquables par Factory<base>.
//! Le nom de la classe tel que considéré par factory est obtenu par un appel à Child::name(), il est donc nécéssaire que l'enfant possède une méthode statique de signature 'static std::string name()'.
#define REGISTER_FACTORY_ENTRY(base, child) \
namespace detail { \
/* nécéssaire pour que la transition soit enregistrée parmis la liste de classes de transitions*/ \
/* variable globale static permettant seulement de forcer l'enregistrement d'une telle classe dans la factory, 'static' permettant l'instantiation de cette variable dans des fichiers .cpp différents lors de l'inclusion*/ \