IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Template, Export bibliothèque


Sujet :

C++

  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Points : 718
    Points
    718
    Par défaut Template, Export bibliothèque
    Bonjour tout le monde,

    Je cherche une méthode afin d'exporter une version compilée de mes templates au sein d'une bibliothèque sans pour autant fournir le fichier du template.

    Est-ce faisable?

    Merci

  2. #2
    Membre expérimenté Avatar de SkyZoThreaD
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2013
    Messages
    583
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juillet 2013
    Messages : 583
    Points : 1 615
    Points
    1 615
    Par défaut
    Une version compilée de templates c++ ? Ça ne fait pas sens pour moi vu que les templates sont utilisés à la compilation
    Ou ai-je mal compris la question ?
    La liberté est à la sociologie ce que l'instant présent est à la physique relativiste.

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Points : 718
    Points
    718
    Par défaut
    Oui, je me suis mal exprimé. En fait, j'ai un template représentant des images. Ces images peuvent être soient de type float soit de type entier par exemple. Je voulais éviter de donner l'implémentation de cette classe template en ne donnant juste leur "spécialisation" (en utilisant typedef par exemple).

  4. #4
    Membre expérimenté Avatar de SkyZoThreaD
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2013
    Messages
    583
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juillet 2013
    Messages : 583
    Points : 1 615
    Points
    1 615
    Par défaut
    Oui si comme j'ai compris, c'est le type de données qui est templatisé, tu dois pouvoir faire un typedef dans un header.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    template<typename T>
    class mine
    {
    public:
    	mine(T v):d(v){}
    private:
    	T d;
    };
     
     
    typedef mine<int> mineint;
    typedef mine<float> minefloat;
    La liberté est à la sociologie ce que l'instant présent est à la physique relativiste.

  5. #5
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Tu peux passer par une astuce: la spécialisation de type incomplet:
    La classe template n'est pas définie dans le cas général, et est spécialisée pour deux cas précis

    L'en-tête contiendrait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    template <typename T>
    class Bidule; //surtout pas d'accolades
     
    template <>
    class Bidule<int> {
       // ce que tu veux
    };
     
    template <typename T>
    class Bidule<float> {
       // ce que tu veux
    };
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  6. #6
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Points : 718
    Points
    718
    Par défaut
    Merci pour vos réponses.

    @SkyZoThreaD: le problème avec cette méthode, c'est que j'exporte le template ce que je souhaite.

    @leternel: je ne souhaite pas vraiment spécialiser les templates, mais plutôt les définir.

    Mon but est d'éviter d'inclure certains en-tête entraînant des dépendances indésirables.

    Voici un exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    // Dans Image.hxx  qui ne serait pas exporté
    #include <header_indesirable.hpp>
     
    template<typename T>
    class Image
    {
    public:
      Image(){}
      void method(); // Méthode qui utilise header_indesirable.hpp
    private:
      T m_data;
    };
     
    template<typename T>
    void method()
    {
    // du code
    }
     
    // Dans ImageImpl.hpp qui serait exporté
     
    typedef Image<int> ImageInt;
    typedef Image<float> ImageFloat;
    Je ne vois vraiment pas si c'est possible mais bon, peut-être qu'il existe une petite astuce sympa pour ce genre de problème.

  7. #7
    Membre expérimenté Avatar de SkyZoThreaD
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2013
    Messages
    583
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juillet 2013
    Messages : 583
    Points : 1 615
    Points
    1 615
    Par défaut
    Citation Envoyé par darkman19320 Voir le message
    @SkyZoThreaD: le problème avec cette méthode, c'est que j'exporte le template ce que je souhaite
    Donc c'est ce que tu souhaites ? Je vais considérer que tu ne le souhaites pas
    Je ne comprend toujours pas bien la question, mais il me semble que tu veux précompiler des templates non spécifiés et comme je l'ai écris avant il me semble que c'est impossible. Les templates sont utilisés à la compilation...
    La liberté est à la sociologie ce que l'instant présent est à la physique relativiste.

  8. #8
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Points : 718
    Points
    718
    Par défaut
    Citation Envoyé par SkyZoThreaD Voir le message
    Donc c'est ce que tu souhaites ? Je vais considérer que tu ne le souhaites pas
    Effectivement, je ne le souhaite pas ^^

    Citation Envoyé par SkyZoThreaD Voir le message
    Je ne comprend toujours pas bien la question, mais il me semble que tu veux précompiler des templates non spécifiés et comme je l'ai écris avant il me semble que c'est impossible. Les templates sont utilisés à la compilation...
    Effectivement, je souhaite précompiler mes templates pour les cas que j'ai spécifié (des images en int et en float). Après, j'ai une solution, recoder la classe sans utilisé de template mais bon c'est un peu lourd ^^

  9. #9
    Membre expérimenté Avatar de SkyZoThreaD
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2013
    Messages
    583
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juillet 2013
    Messages : 583
    Points : 1 615
    Points
    1 615
    Par défaut
    Ok tout est clair maintenant
    Donc je ne pense pas que ce soit possible mais attend la réponse d'un plus calé que moi. Le c++ est si tortueux... sait-on jamais...
    La liberté est à la sociologie ce que l'instant présent est à la physique relativiste.

  10. #10
    Expert éminent
    Avatar de Pyramidev
    Homme Profil pro
    Développeur
    Inscrit en
    Avril 2016
    Messages
    1 471
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 471
    Points : 6 110
    Points
    6 110
    Par défaut
    C'est possible.

    Voici un exemple illustratif :

    CartableCasse.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #ifndef MODELE_PAS_DEFINI_DANS_ENTETE_CARTABLE_CASSE
    #define MODELE_PAS_DEFINI_DANS_ENTETE_CARTABLE_CASSE
     
    #include <iostream>
     
    class CartableCasse
    {
    public:
    	void car()   const { std::cout << "CartableCasse::car()\n";   }
    	void table() const { std::cout << "CartableCasse::table()\n"; }
    	void casse() const { std::cout << "CartableCasse::casse()\n"; }
    };
     
    #endif
    CartoucheCasse.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #ifndef MODELE_PAS_DEFINI_DANS_ENTETE_CARTOUCHE_CASSE
    #define MODELE_PAS_DEFINI_DANS_ENTETE_CARTOUCHE_CASSE
     
    #include <iostream>
     
    class CartoucheCasse
    {
    public:
    	void car()    const { std::cout << "CartoucheCasse::car()\n";    }
    	void touche() const { std::cout << "CartoucheCasse::touche()\n"; }
    	void casse()  const { std::cout << "CartoucheCasse::casse()\n";  }
    };
     
    #endif
    MonModele.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #ifndef MODELE_PAS_DEFINI_DANS_ENTETE_MON_MODELE
    #define MODELE_PAS_DEFINI_DANS_ENTETE_MON_MODELE
     
    template<class T>
    class MonModele
    {
    private:
    	T m_data;
    public:
    	void carcasse()  const;
    	void cartable()  const;
    	void cartouche() const;
    };
     
    #endif
    MonModele_impl.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #ifndef MODELE_PAS_DEFINI_DANS_ENTETE_MON_MODELE_IMPL
    #define MODELE_PAS_DEFINI_DANS_ENTETE_MON_MODELE_IMPL
     
    #include "MonModele.h"
     
    template<class T>
    void MonModele<T>::carcasse() const
    {
    	m_data.car();
    	m_data.casse();
    }
     
    template<class T>
    void MonModele<T>::cartable() const
    {
    	m_data.car();
    	m_data.table();
    }
     
    template<class T>
    void MonModele<T>::cartouche() const
    {
    	m_data.car();
    	m_data.touche();
    }
     
    #endif
    MonModeleCartableCasse.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include "CartableCasse.h"
    #include "MonModele_impl.h"
     
    // Instancier les fonctions qui compilent pour T = CartableCasse :
    template void MonModele<CartableCasse>::carcasse() const;
    template void MonModele<CartableCasse>::cartable() const;
    MonModeleCartoucheCasse.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include "CartoucheCasse.h"
    #include "MonModele_impl.h"
     
    // Instancier les fonctions qui compilent pour T = CartoucheCasse :
    template void MonModele<CartoucheCasse>::carcasse()  const;
    template void MonModele<CartoucheCasse>::cartouche() const;
    main.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #include "MonModele.h"
    #include "CartableCasse.h"
    #include "CartoucheCasse.h"
     
    #include <iostream>
     
    int main()
    {
        MonModele<CartableCasse> foo;
        foo.carcasse();
        foo.cartable();
     
        std::cout << '\n';
     
        MonModele<CartoucheCasse> bar;
        bar.carcasse();
        bar.cartouche();
     
        return 0;
    }
    Sortie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CartableCasse::car()
    CartableCasse::casse()
    CartableCasse::car()
    CartableCasse::table()
     
    CartoucheCasse::car()
    CartoucheCasse::casse()
    CartoucheCasse::car()
    CartoucheCasse::touche()

  11. #11
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    En utilisant les extern template, et en forçant les instanciations on peut aussi le faire sur la classe entière
    fichier .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #ifndef DLLMASQUEE
      #define DLLIMP __declspec(dllimport)
    #else
      #define DLLIMP __declspec(dllexport)
    #endif
     
    template<class T> class DLLIMP Masquee {
    	T x;
    public:
    	Masquee(T const x) : x{ x } {}
    	T action()const;
    };
    fichier .cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #define DLLMASQUEE
    #include "Masquee.h"
     
    template<class T> T Masquee<T>::action()const {
    	return 2 * x;
    }
     
    template class Masquee<int>; // forcer l'instanciation des cas int et float
    template class Masquee<float>;
    On pourra alors utiliser les Masquee<> qui ont été instanciées dans la DLL.

  12. #12
    Expert éminent
    Avatar de Pyramidev
    Homme Profil pro
    Développeur
    Inscrit en
    Avril 2016
    Messages
    1 471
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 471
    Points : 6 110
    Points
    6 110
    Par défaut
    Je me rends compte que mon exemple précédent était inutilement compliqué.
    J'ai créé un exemple un peu plus simple qui utilise aussi l'astuce que viens de donner dalfab :

    Car.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #ifndef MODELE_PAS_DEFINI_DANS_ENTETE_CAR
    #define MODELE_PAS_DEFINI_DANS_ENTETE_CAR
     
    #include <iostream>
     
    class Car
    {
    public:
    	void car() const { std::cout << "Car::car()\n"; }
    };
     
    #endif
    Cartable.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #ifndef MODELE_PAS_DEFINI_DANS_ENTETE_CARTABLE
    #define MODELE_PAS_DEFINI_DANS_ENTETE_CARTABLE
     
    #include <iostream>
     
    class Cartable
    {
    public:
    	void car()   const { std::cout << "Cartable::car()\n";   }
    	void table() const { std::cout << "Cartable::table()\n"; }
    };
     
    #endif
    DoubleAction_light.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #ifndef MODELE_PAS_DEFINI_DANS_ENTETE_DOUBLE_ACTION_LIGHT
    #define MODELE_PAS_DEFINI_DANS_ENTETE_DOUBLE_ACTION_LIGHT
     
    #include <iostream>
     
    template<class T>
    class DoubleAction
    {
    private:
    	T m_data;
    public:
    	DoubleAction() { std::cout << "DoubleAction constructor\n"; }
    	~DoubleAction();
    	void doubleCar()   const;
    	void doubleTable() const;
    };
     
    #endif
    DoubleAction.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    #ifndef MODELE_PAS_DEFINI_DANS_ENTETE_DOUBLE_ACTION
    #define MODELE_PAS_DEFINI_DANS_ENTETE_DOUBLE_ACTION
     
    #include "DoubleAction_light.h"
     
    template<class T>
    DoubleAction<T>::~DoubleAction()
    {
    	std::cout << "DoubleAction destructor\n";
    }
     
    template<class T>
    void DoubleAction<T>::doubleCar() const
    {
    	m_data.car();
    	m_data.car();
    }
     
    template<class T>
    void DoubleAction<T>::doubleTable() const
    {
    	m_data.table();
    	m_data.table();
    }
     
    #endif
    DoubleAction_Car_Cartable.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include "Car.h"
    #include "Cartable.h"
    #include "DoubleAction.h"
     
    // Instancier les fonctions qui compilent pour T = Car :
    template DoubleAction<Car>::~DoubleAction();
    template void DoubleAction<Car>::doubleCar() const;
     
    // Instancier toute la classe pour T = Cartable :
    template class DoubleAction<Cartable>;
    Main.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #include "Car.h"
    #include "Cartable.h"
    #include "DoubleAction_light.h"
     
    #include <iostream>
     
    int main()
    {
        DoubleAction<Car> foo;
        foo.doubleCar();
     
        std::cout << '\n';
     
        DoubleAction<Cartable> bar;
        bar.doubleCar();
        bar.doubleTable();
     
        std::cout << '\n';
     
        return 0;
    }
    Sortie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    DoubleAction constructor
    Car::car()
    Car::car()
     
    DoubleAction constructor
    Cartable::car()
    Cartable::car()
    Cartable::table()
    Cartable::table()
     
    DoubleAction destructor
    DoubleAction destructor

  13. #13
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Points : 718
    Points
    718
    Par défaut
    Super!
    Merci pour vos conseils!
    Je viens de faire des tests et je vais utiliser la méthode de dalfab plutôt.

    Voici mon petit exemple de test avec les fichiers CMake associés (j'ai testé sous Visual Studio 2010 et 2015).
    ExportPreCompiledTemplate.zip

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] Créer une template/Exporter structure
    Par CIFQ_Drew dans le forum Modélisation
    Réponses: 4
    Dernier message: 04/10/2010, 15h42
  2. Frameworks, templates et bibliothèques
    Par gerald57 dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 19/06/2008, 09h40
  3. Réponses: 0
    Dernier message: 24/07/2007, 13h22
  4. Réponses: 7
    Dernier message: 15/12/2006, 18h31
  5. [FLASH MX2004] Exporter un bitmap de la bibliothèque
    Par JavaSearch dans le forum Flash
    Réponses: 2
    Dernier message: 11/04/2006, 14h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo