Co to jest "alias przestrzeni nazw" w C++? Jak to jest używane?Co to jest "alias przestrzeni nazw" w języku C++?
Odpowiedz
Alias przestrzeni nazw jest wygodnym sposobem na odwoływanie się do nazwy długiej przestrzeni nazw za pomocą innej, krótszej nazwy.
Jako przykład, powiedzmy, że chcesz użyć liczbowych wektorów z uBLAS Boosta bez dyrektywy using namespace
. Podając pełną nazw za każdym razem jest uciążliwy:
boost::numeric::ublas::vector<double> v;
Zamiast tego można zdefiniować alias dla boost::numeric::ublas
- powiedzmy chcemy skrócić ten właśnie ublas
:
namespace ublas = boost::numeric::ublas;
ublas::vector<double> v;
Dość prosto, #define nie zadziała.
namespace Mine { class MyClass { public: int i; }; }
namespace His = Mine;
namespace Yours { class Mine: public His::MyClass { void f() { i = 1; } }; }
Kompiluje dobrze. Umożliwia pracę w przypadku kolizji nazw i klas.
namespace Nope { class Oops { public: int j; }; }
#define Hmm Nope
namespace Drat { class Nope: public Hmm::Oops { void f() { j = 1; } }; }
W ostatnim wierszu "Hmm: Oops" jest błędem kompilacji. Pre-procesor zamienia go na Nope :: Oops, ale Nope jest już nazwą klasy.
Więcej na ten temat http://channel9.msdn.com/Series/C9-Lectures-Stephan-T-Lavavej-Core-C-/Stephan-T-Lavavej-Core-C-1-of-n
Chodzi przede wszystkim o wyborze alias dłuuugi nazwą przestrzeni nazw, takich jak:
namespace SHORT = NamespaceFirst::NameSpaceNested::Meow
potem można typedef
typedef SHORT::mytype
zamiast
typedef NamespaceFirst::NameSpaceNested::Meow::mytype
Składnia ta działa tylko dla nazw, nie może zawierać klasy, typy po namespace NAME =
pamiętać również, że aliasy nazw i używając dyrektyw są rozwiązywane w czasie kompilacji, a nie czas pracy. (Mówiąc dokładniej, oba są narzędziami używanymi do informowania kompilatora, gdzie jeszcze szukać przy rozwiązywaniu nazw, jeśli nie może znaleźć określonego symbolu w bieżącym zakresie lub żadnym z jego zakresów nadrzędnych.) Na przykład, żaden z nich nie będzie skompilować:
namespace A {
int foo;
namespace AA {
int bar;
} // namespace AA
namespace AB {
int bar;
} // namespace AB
} // namespace A
namespace B {
int foo;
namespace BA {
int bar;
} // namespace BA
namespace BB {
int bar;
} // namespace BB
} // namespace B
bool nsChooser1, nsChooser2;
// ...
// This doesn't work.
namespace C = (nsChooser1 ? A : B);
C::foo = 3;
// Neither does this.
// (Nor would it be advisable even if it does work, as compound if-else blocks without braces are easy to inadvertently break.)
if (nsChooser1)
if (nsChooser2)
using namespace A::AA;
else
using namespace A::AB;
else
if (nsChooser2)
using namespace B::BA;
else
using namespace B::BB;
teraz ciekawy umysł może zauważyli, że constexpr
zmienne są również używane w czasie kompilacji, i zastanawiam się, czy mogą one być stosowane w połączeniu z obu aliasu lub dyrektywy. Według mojej wiedzy nie mogą, chociaż mogę się mylić. Jeśli chcesz pracować ze zmiennymi o tej samej nazwie w różnych obszarach nazw i wybierać między nimi dynamicznie, musisz użyć referencji lub wskaźników.
// Using the above namespaces...
int& foo = (nsChooser1 ? A::foo : B::foo);
int* bar;
if (nsChooser1) {
if (nsChooser2) {
bar = &A::AA::bar;
} else {
bar = &A::AB::bar;
}
} else {
if (nsChooser2) {
bar = &B::BA::bar;
} else {
bar = &B::BB::bar;
}
}
Użyteczność powyższego może być ograniczona, ale powinna służyć temu celowi.
(Moje przeprosiny za wszelkie błędy, które mogłem pominąć w powyższym.)
- 1. Alias w przestrzeni nazw w F #?
- 2. Alias nazw obszarów nazw
- 3. Co to jest ".. ::." w języku C#?
- 4. Co to jest void * w języku C#?
- 5. Co to jest alias w font-awesome?
- 6. Co to jest wyszukiwanie nazw C++? (I jest GCC prawda?)
- 7. Jaki jest zakres aliasu przestrzeni nazw w C++?
- 8. Wyjaśnienie przestrzeni nazw w języku Python
- 9. Stała przestrzeni nazw w C#
- 10. Co to jest "@_silgen_name" w języku Swift?
- 11. zewnętrzne powiązanie "C" w przestrzeni nazw C++?
- 12. Co to jest przestrzeń nazw w aerospike
- 13. Co to jest "1ULL" w języku programowania
- 14. Dostęp do globalnej przestrzeni nazw C++ z innej przestrzeni nazw
- 15. Co to jest odpowiednik C# z instrukcją With w VB?
- 16. Co oznacza "[to]" oznacza w języku C++
- 17. Co to jest "return x? : 1 "oznacza w języku C?
- 18. Co to jest odpowiednik vbNullChar w języku C#?
- 19. Co to jest odpowiednik NSDictionary w języku C#?
- 20. Co to jest użycie funkcji c_str W języku C++
- 21. Co to jest typ zerowy w języku C#?
- 22. Metody wewnątrz przestrzeni nazw C#
- 23. Co to jest "==" w C?
- 24. Co to jest wyrażenie w języku Python?
- 25. Co to jest "String ..." w języku Java?
- 26. Co to jest "_csv" w języku Python?
- 27. W języku PHP, co to jest Tick?
- 28. Co to jest dosłownie w języku Java?
- 29. Co to jest "\ 00" w języku Python?
- 30. Co to jest mnemonik w języku Java?
Aby możliwie wyjaśnić spadki, SO nie jest i nigdy nie zastąpi dobrego podręcznika C++. Na postawione pytanie odpowie odpowiedź na każdą taką książkę. A SO "funkcja" odpowiadania na własne pytania nie powinna być używana do dostarczania parafraz takich książek. –
Bez urazy ... Po prostu wyjaśnić, dlaczego to zrobiłem: To było moje zrozumienie z komentarzy Joela z podcastu, że nawet pytania "na poziomie podstawowym" były uczciwą grą na SO i że można zadać pytanie i odpowiedź samemu, jeśli ta treść nie była jeszcze dostępna w SO w przystępnej formie. Ale najwyraźniej jest to mile widziane? –
Istnieje na pewno etykieta, aby odpowiedzieć na własne pytanie, aby uniknąć irytacji; w tym przypadku jest oczywiste, że nigdy ** nie było prawdziwym pytaniem. Na przykład http://stackoverflow.com/questions/494927/stack-overflow-etiquette-for-answering-your-own-question –