2010-07-23 17 views
8

Chciałbym zbudować coś takiego:„szablonów” przestrzeń nazw

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

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

Oczywiście nie jest to możliwe, ponieważ nie można szablonów nazw. Zamiast tego mógłbym użyć struct zamiast przestrzeni nazw, ale wtedy nie mogę rozprzestrzenić funkcji przestrzeni nazw na kilka plików.

Czy istnieje rozwiązanie tego problemu?

PS: Wiem, że mogłem zaprojektować klasy, ale wtedy musiałbym określić, jaki typ wektora chcę użyć w dowolnym momencie, kiedy tworzę nową klasę.

+1

Jeśli chodzi o PS: Jak według Ciebie posiadanie szablonowej przestrzeni nazw usunie potrzebę określenia typu wektora podczas tworzenia instancji klas? Nadal potrzebujesz co najmniej czegoś podobnego do (fikcyjnego) 'using namespace myNamespace ;' – stakx

+1

Jestem z tego powodu. A co to jest 'int' w twoim kodzie? – sbi

+0

Tak, ale możesz zrobić coś takiego: int function1() { przy użyciu przestrzeni nazw myNamespace ; myClass1 c1 = myClass1 (5); myClass2 c2 = myClass2 (2); } int function2() { przy użyciu przestrzeni nazw myNamespace ; myClass1 c1 = myClass1 ("a"); myClass2 c2 = myClass2 ("b"); } Niestety, ta int jest nieprawidłowa, usunę ją. Jak wkleić kod poprawnie? – Manuel

Odpowiedz

5

Nawiązując do Twojego komentarza:

Zamiast pisać

using namespace myNamespace<int>;

wystarczy użyć na matrycy klasy i napisać to zamiast (lub cokolwiek zmienność):

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

bywam uważam, że lepiej jest mówić otwarcie o tym, jakie typy są używane, niż próbować zrobić coś takiego jak importowanie określonego instanu tacji przestrzeni nazw.

Czy można dokładniej opisać problem, który powoduje, że szablony mogą być przydatne w miejscach nazw?

Pamiętaj, że zawsze możesz napisać darmową funkcję make_myClass1, aby wydedukować typ szablonu dla siebie.

+0

Prawdopodobnie dobry pomysł. – Manuel

+2

@ Mark B Wiem, że to naprawdę stare pytanie, ale co jeśli chcesz czegoś w rodzaju klasy 'Util' z tylko statycznymi metodami?Czy nie byłoby lepiej używać przestrzeni nazw? – AJC

2

Nie można tego zrobić, ale można podać różne przestrzenie nazw i typy maszyn (nie to, że je popieram).

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; 
} 
0

W każdym razie, moje zajęcia mają kilka parametrów szablonu. Teraz stworzyłem tego podejścia:

#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; 

} 

i myślę, że będę połączyć je z podejściem Mark B.!

Pozdrowienia, chłopaki!

Powiązane problemy