“template” di uno spazio dei nomi

Mi piacerebbe costruire qualcosa di simile a questo:

File 1:
template<typename Vector>
namespace myNamespace {
  class myClass1{ myClass1(Vector v) {...} }
}

File 2:
template<typename Vector>
namespace myNamespace {
  class myClass2{ myClass2(Vector v) {...} }
}

Naturalmente questo non è possibile perché non è possibile modello di spazi dei nomi.
Invece ho potuto usare una struct invece di uno spazio dei nomi, ma poi non riesco a diffondere lo spazio dei nomi di funzioni su più file.

C’è qualche soluzione per tale problema?

PS: so che potrei modello le classi, ma poi avrei dovuto specificare che tipo di vettore voglio usare ogni volta che vado a creare una nuova classe.

  • Riguardo il tuo PS: Come si fa a pensare di avere un basato su modelli dello spazio dei nomi eliminerebbe la necessità di specificare il tipo di grafica vettoriale, quando si crea un’istanza di classi? Avresti ancora bisogno almeno di qualcosa di simile a un (fittizio) using namespace myNamespace<some_vector_t>;
  • Io sto con stakx su questo. E la cosa che int nel codice?
  • Sì, ma allora si potrebbe fare qualcosa di simile a questo: int funzione1() { using namespace myNamespace<int>; myClass1 c1 = myClass1(5); myclass2 rispettivamente c2 = myclass2 rispettivamente(2); } int funzione2() { using namespace myNamespace<char>; myClass1 c1 = myClass1(‘a’); myclass2 rispettivamente c2 = myclass2 rispettivamente(‘b’); } mi Dispiace, che int è sbagliato, io lo cancella. Come faccio a incollare qui il codice correttamente?
InformationsquelleAutor Manuel | 2010-07-23

 

3 Replies
  1. 6

    Seguito il tuo commento:

    Invece di scrivere

    using namespace myNamespace<int>;

    Basta usare basato su modelli e classi di scrivere questo invece (o qualunque variazione):

    typedef myNamespace::myClass1<int> myClass1Int;
    typedef myNamespace::myClass2<int> myClass2Int;

    Io tendo a pensare che è meglio essere espliciti su ciò che tipi sono utilizzati piuttosto che provare a fare qualcosa come importare un determinato creazione di uno spazio dei nomi.

    Si può descrivere più completamente il problema che ti fa pensare basato su modelli spazi dei nomi sarebbe utile?

    E ricordate che si può sempre scrivere un make_myClass1 la funzione di dedurre il tipo di modello per voi.

    • Probabilmente una buona idea.
    • B so che questa è una vecchia questione, ma se vuoi qualcosa di simile a un Util classe solo con metodi statici? Non utilizzando un namespace essere migliore per questo?
  2. 2

    Non è possibile farlo, ma è in grado di fornire diversi spazi dei nomi e typedef (non che io lo sostiene).

    namespace template_impl {
       template <typename V>
       class myClass1_tmpl {...};
       template <typename V>
       class myClass2_tmpl {...};
    }
    namespace myns_Vector1 {
       typedef ::template_impl::myClass1_tmpl<Vector1> myClass1;
       typedef ::template_impl::myClass2_tmpl<Vector1> myClass2;
    }
    void foo() {
       using namespace myns_Vector1;
       myClass1 mc1;
    }
  3. 0

    Comunque, le mie lezioni sono diversi i parametri del modello.
    Ora ho creato questo approccio:

    #include <string>
    #include <iostream>
    
    namespace myNamespace {
      template<typename _integer, typename _string>
      struct s {
        typedef _integer integer;
        typedef _string string;
      };
    
      template<class T>
      class classA {
      public:
        static typename T::integer intFunc() { return 1; }
        static typename T::string stringFunc() { return "hallo"; }
      };
    }
    
    
    int main() {
      using namespace myNamespace;
    
      typedef s<int, std::string> types1;
      typedef s<unsigned int, char*> types2;
    
      std::cout << classA<types1>::intFunc() << std::endl;
      std::cout << classA<types1>::stringFunc() << std::endl;
    
      std::cout << classA<types2>::intFunc() << std::endl;
      std::cout << classA<types2>::stringFunc() << std::endl;
    
    }

    e penso di combinare con Mark B approccio!

    Grazie, ragazzi!

Lascia un commento