Partage
  • Partager sur Facebook
  • Partager sur Twitter

stocker un type dans une variable

Sujet résolu
16 août 2018 à 10:36:07

peut on stocker un type dans une variable (genre string str="int")

et utiliser une fonction equivalente a valueOf de java pour instancier une variable: c#valueOf(str) t(5);

ou peut on instancier une variable avec un type ou une variable?

  • Partager sur Facebook
  • Partager sur Twitter
16 août 2018 à 11:34:47

C'est pas hyper clair comme questions, mais je pense que tu veux parler du concept de réflexivité et d'instanciation dynamique. Je me trompe ?

Sinon, pour convertir un std::string en int =>

 int i = std::atoi("25");



Oui, il est possible de mettre en place un tel mécanisme qui permet d'instancier un objet à partir du nom de sa classe. Mais ce n'est pas présent nativement en C++ (et pas simple) comme c'est le cas en Java par exemple. C'est à toi d'implémenter le mécanisme.

Pour cela, il faut créer un mapping entre le nom de la classe et un pointeur sur une fonction qui appelle le constructeur et renvoie l'objet instancié. Chaque classe qui a besoin d'être instancié dynamiquement devrait donc se déclarer (register) pour être accessible dans ce mapping.

Voici un morceau de diagramme UML (un peu foireux) qui présente le principe (Je ne peux pas fournir le code..dsl).

Les objets qui doivent être instancié dynamiquement doivent hériter de "Invokable" et sont déclarés avec les maccros (REGISTER_INVOCABLE) qui crée une instance static de la classe "Invoker". La construction de l'"Invoker" permet de compléter le mapping dans la classe "Invocations" avec la méthode Invokable<Type>::createT et le nom de la classe "Type" correspondant (ou "T" dans le diagramme).

-
Edité par CeBiM 16 août 2018 à 12:11:02

  • Partager sur Facebook
  • Partager sur Twitter
Les seules questions bêtes sont celles qui ne sont pas posées. Mieux vaut paraître bête une fois que de le rester à vie."Vis comme si tu devais mourir demain. Apprends comme si tu devais vivre toujours."
16 août 2018 à 12:01:28

merci pour ta réponse.

Ca me promet une apres midi riche en debuggage :p et en enseignements :pirate:

  • Partager sur Facebook
  • Partager sur Twitter
16 août 2018 à 14:44:08

GouyFred a écrit:

peut on stocker un type dans une variable (genre string str="int")

Un type n'est jamais stockable en temps que tel. On peut néanmoins stocker un moyen d'identifier un type.
Exemple (en C++17) :

std::any   donnee1 = 12.3;
std::any   donnee2 = true;

Les variables donnee1 et donnee2 vont retenir que donnee1 est un double qui vaut 12.3 et que donnee2 est un bool qui vaut true;
Mais ces données sont inutilisables si on "oublie" leur type.

double x = std::any_cast<double>(donnee1); // fonctionne mais si utilise autre chose que double, il y aura exception std::bad_any_cast

GouyFred a écrit:

et utiliser une fonction equivalente a valueOf de java pour instancier une variable: c#valueOf(str) t(5);

Produire une variable dont le type est une donnée n'a pas de sens. Le C++ n'est pas un langage orienté objet, il n'existe pas un type "Object" duquel tout type dérive. même en utilisant std::any on ne peut pas faire : std::any truc = ?quoi ecrire ici?;

GouyFred a écrit:

ou peut on instancier une variable avec un type ou une variable?

Instancier à partir d'un type, on peut, c'est que l'on écrit tous les jours : int x = 3; //=> instancier un int qui vaut 3
Instancier à partir d'un type T qui vient d'un paramètre template est possible, mais là aussi le type doit être connu à la compilation.
Instancier à partir d'un type dont le nom est "écrit" dans un texte n'a pas de sens.

Instancier à partir d'une variable. On peut par exemple mettre une fonction dans la variable (qui peut être virtual) pour générer un pointeur objet vers un type identique (car on a accès à une base connue commune)

class UnObjet {
public:
   virtual std::unique_ptr<UnObjet> Creer()const;
};

class UnAutre : public UnObjet {
public:
   virtual std::unique_ptr<UnObjet> Creer()const override {
      return std::make_unique<UnAutre>();  // sait créer un objet du même type
   }
};

int main() {
   UnAutre   unAutre;
   UnObjet&  unObjet = unAutre;              // on "oublie" que c'est un UnAutre

   std::unique_ptr<UnObjet> unObjet.Creer(); // Va créer un smart pointeur sur un UnAutre
}
  • Partager sur Facebook
  • Partager sur Twitter

En recherche d'emploi.

16 août 2018 à 15:34:36

Je savais  que ce que je faisais était insensé... xD

Pourquoi tu dis ça ? Tu n'en vois pas l'utilité, mais de là à dire que c'est insensé...L'instanciation dynamique n'a donc pas de sens ?

Dalfab a écrit:

Instancier à partir d'un type dont le nom est "écrit" dans un texte n'a pas de sens.

-
Edité par CeBiM 16 août 2018 à 15:36:07

  • Partager sur Facebook
  • Partager sur Twitter
Les seules questions bêtes sont celles qui ne sont pas posées. Mieux vaut paraître bête une fois que de le rester à vie."Vis comme si tu devais mourir demain. Apprends comme si tu devais vivre toujours."
16 août 2018 à 16:33:14

Je sais pas si j'ai bien compris la question, mais stocké des types dans des variables peut se faire assez facilement :
Mais ça ne peut pas être réellement dynamique au sens d'un string ;)

template<bool v>
struct Bool {
    constexpr operator bool() const noexcept {return v;}
};

using True = Bool<true>;
using False = Bool<false>;

// Peut être remplacé par std::true_type / false_type
// Tu peux implémenter les opérateurs &&, || etc pour Bool

template<typename T>
struct type_t {
    using type = T;
};

template<typename T>
constexpr True operator==(type_t<T>, type_t<T>) {
    return {};
}

template<typename T1, typename T2>
constexpr False operator==(type_t<T1>, type_t<T2>) {
    return {};
}

// same for operator !=

template<typename T>
inline constexpr type_t type_v<T>;

static_assert(type_v<int> == type_v<int>);

template<typename T>
void foo(type_t<T>) {
    T a;
}

foo(type_c<int>);
foo(type_c<double>);

C'est un peu comme ça que Hana fonctionne (le code ci dessus n'a pas été testé, mais c'est l'idée)

  • Partager sur Facebook
  • Partager sur Twitter
http://cpp-rendering.io : Vous trouverez tout ce dont vous avez besoin sur Vulkan / OpenGL et le rendu 3D !
16 août 2018 à 17:04:07

Bon...je vous avouerais que j ai pas le niveau des intervenants et que vos réponses ont renforcer l industrie pharmaceutique du pays :j en suis a mon quatrième tube d aspirine.

Alors posons l affaire au grand jour quitte a finir lapidé:

quand j etais jeune(y a longtemps) on m a  initié aux arcanes secretes des algorithmes génétiques.mélange subtiles de science dure  et de rêve :p.

Du coup j apprends le c++ sur ce site(langage qui de mon temps n avait rien d incontournable la POO etait a mis chemin entre la fantasie et l util).

du coup avec mon jargon d ancien j essaie de poser mes concepts:

une population est composée d individu

un individu appartient a une espece et a un genome.

un individu est donc une instance d une espece qui a une structure genetique qui caracterise l espece.

cette structure genetique je voulais que ce soit une classe tant je n arrive pas a voir une superclasse qui pourrait la chapeauter:

elle peut etre représenter par 15 tableaux ou 3 tableaux qui n ont pas forcement le meme type de donneés contenu.Du coup je voulais stocker la structure genetique dans une string qui aurait contenu le nom de la classe.

evidemment de population en population je sais pas ce qui sera instancié...du coup comment representer cette structure gentique qui caractérise l espece?

  • Partager sur Facebook
  • Partager sur Twitter
16 août 2018 à 17:19:51

Salut,

Arrête d'apprendre la programmation en C++ sur ce site. Utilise plutôt le cours de gbdivers (guillaume beltz). Le C++ n'est pas non plus un langage orienté objet

Pour ton problème tu peux peut être te renseigner sur le sum-types (std::variant).

  • Partager sur Facebook
  • Partager sur Twitter
http://cpp-rendering.io : Vous trouverez tout ce dont vous avez besoin sur Vulkan / OpenGL et le rendu 3D !
16 août 2018 à 17:33:14

Bon, les gars, je crois qu'on a dégainé l'arme atomique (réflexivité) pour écraser une mouche. :-°

Il est tout à fait possible de faire une usine à gaz dans votre cas, mais pourquoi faire compliqué ???

Je suis une tanche qui n'a plus fait de biologie depuis son BAC au millénaire précédent, mais j'ai quand même un peu de mal avec votre définition d''individu, d'espèce et de "structure génétique".

Un individu ayant le syndrome de Down (trisomie 21), ou un triple X, n'a pas la structure générique identique à la "norme" humaine, mais c'est quand même un humain, non ?

L'aspect "variabilité" est très importante dans la conception des classes et doit être clair dès le départ.

Pourquoi un "individu" n'est pas juste une instance d'une classe "Individu" qui prendrait en paramètre du constructeur un std::vector d'objets représentant une "structure génétique"  (ou mieux, une classe "structure génétique")?

P.S.; Stoppez immédiatement de lire le cour de C++ de ce site, c'est une horreur qui ne vous apprend que des choses que vous devrez désapprendre dans les plus brefs délais. Le forum dispose de réponses sur le sujet d'un bon cours qui se posent plusieurs fois par semaine.

  • Partager sur Facebook
  • Partager sur Twitter
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
16 août 2018 à 17:41:40

en fait le principe des algorithmes génétiques c est de s occuper de problemes d optimisations(on peut coder un polynome en tant qu individu ou une fonction une somme d exponentielle ...du coup la nécessité de la variété des représentations des structures génétiques n est pas une fantaisie)

on pose une fonction d evaluation  dapres la nature du probleme sur chaque individu on croise les plus performant on applique un taux de mutation pour eviter de rester bloquer dans un champ du probleme, et si le probleme est de nature mathémathique a etre traité par cet algo on obtient une jolie solution.

  • Partager sur Facebook
  • Partager sur Twitter
16 août 2018 à 18:12:09

>de la variété des représentations des structures génétiques n est pas une fantaisie

Je n'ai pas dit le contraire, loin de là.

C'est juste qu'il faut cadrer le bidule.

Avec une instance de "structure génétique" en paramètre du constructeur de l'individu, vous pouvez faire varier la structure génétique à chaque création d'objet (il est même possible de la faire variée en cour de vie de l'individu en proposant des méthodes ad hoc pour le faire).

Vous appliquez votre fonction de sélection sur les individus, vous récupérez leur "code génétique" des sélectionner, vous faites votre formule de perlimpinpin sur ces codes génétiques pour générer une nouvelle génération de code génétique, que vous donnez comme paramètre des nouvelles instances de la classe "Individu".

Après, s'il n'y a pas de facteur environnemental et que seul le code génétique compte, pourquoi ce faire chier avec une classe "individu", seul le code génétique compte.

Vous n'êtes vraiment pas clair. Je suis une tanche en biologie mais faudrait pas me prendre pour un poussin en informatique, j'en sais largement en code génétique informatique pour savoir qu'il y a plusieurs dizaine de manière de voir ce type de programmation et que leurs implémentations sont très très différentes.

C'est quoi le modèle de programmation génétique que vous comptez implémenter ?

  • Partager sur Facebook
  • Partager sur Twitter
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
16 août 2018 à 19:51:51

bacelar:"C'est quoi le modèle de programmation génétique que vous comptez implémenter ?"

Disons une interpolation de signaux par des fonctions mathémathiques(fourier, exponentielle, polynomiales,ect...dans des espaces de dimension variable. )(sinon loin de moi l idée de dire que tu n es qu un poussin en info je voulais juste dire pourquoi je souhaitais(sans réaliser que c etait un probleme) avoir de la latitude sur cette donnée.

le bonheur ca aurait été une implémentation de l algo assez générique pour...etre réutilisable: avoir l ossature quoi.

Mais bon je comprends :c est pas comme je croyais.

Sinon sur l intervention de cebim,au début:

je crois sans te trahir que tu parlais de faire un mapping entre les strings qui contiennent le nom des classes et des pointeurs sur des fonctions qui invoquent le constructeur de la classe.

On peut pas poser de pointeur sur le constructeur? il faut passer par une fonction qui l utilise? le constructeur n est pas une "vraie" fonction?(sachant que son type est void ca m évite les soucis de déclarer le type de renvoie de la fonction quand je déclare le pointeur de fonction)

-
Edité par GouyFred 16 août 2018 à 19:53:11

  • Partager sur Facebook
  • Partager sur Twitter
16 août 2018 à 23:28:53

Votre message originale était assez stéréotypé comme personne voulant faire de la réflexivité, expliquant les différentes réponses initiales axées sur cette optique.

Cela peut être un besoin pour de la programmation génétique, mais dans des cas très complexe à base de générations automatiques de code.

Je ne vois rien dans votre problématique, très axées "exploration opérationnelle", serait une bonne candidate pour de la programmation génétique.

Les différentes "méthodes" d'interpolations ne rentreront pas en synergie, les progrès/avancés de l'une ne permettent pas d'accélérer une autre.

Pouvez-vous vous référer à la littérature sur la programmation génétique pour avoir un exposé plus claire de vos besoins en terme de modèles de programmation génétiques ?

Comme, pour moi, chaque méthode d'interpolation est indépendante, l'histoire de la sélection n'est là que pour faire une implémentation d'une fonction heuristique pour utiliser les ressources plus dans une méthode que dans une autre.

C++ dispose d'un nombre impressionnant de mécanismes pour faires du code générique, il faut juste qu'on sache de quel type de généricité vous voulez parler.

Vous pouvez illustrer votre problématique avec un cas concret et les axes de généricité à partir de ce cas concret ?

  • Partager sur Facebook
  • Partager sur Twitter
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.