Ujednoznacznij pojęcie „funkcja pomocnicza”. Jedna z definicji to funkcja wygody, z której cały czas korzystasz tylko po to, aby wykonać jakąś pracę. Mogą one mieszkać w głównej przestrzeni nazw i mieć własne nagłówki itp. Druga definicja funkcji pomocniczej jest funkcją użyteczną dla pojedynczej klasy lub rodziny klas.
// a general helper
template <class T>
bool isPrinter(T& p){
return (dynamic_cast<Printer>(p))? true: false;
}
// specific helper for printers
namespace printer_utils {
namespace HP {
print_alignment_page() { printAlignPage();}
}
namespace Xerox {
print_alignment_page() { Alignment_Page_Print();}
}
namespace Canon {
print_alignment_page() { AlignPage();}
}
namespace Kyocera {
print_alignment_page() { Align(137,4);}
}
namespace Panasonic {
print_alignment_page() { exec(0xFF03); }
}
} //namespace
Teraz isPrinter
jest dostępny dla każdego kodu, w tym jego nagłówka, ale print_alignment_page
wymaga
using namespace printer_utils::Xerox;
dyrektywy. Można go również określić jako
Canon::print_alignment_page();
żeby być bardziej zrozumiałym.
C ++ STL ma std::
przestrzeń nazw, która obejmuje prawie wszystkie swoje klasy i funkcje, ale dzieli je kategorycznie na ponad 17 różnych nagłówków, aby umożliwić koderowi usunięcie nazw klas, nazw funkcji itp., Jeśli chcą pisać ich własny.
W rzeczywistości NIE zaleca się używania using namespace std;
w pliku nagłówkowym lub, jak to często bywa, jako pierwszej linii w środku main()
. std::
składa się z 5 liter i często wydaje się uciążliwym wstępem do funkcji, której chce się używać (zwłaszcza std::cout
i std::endl
!), ale służy to celowi.
Nowy C ++ 11 ma pewne podprzestrzenie nazw dla usług specjalnych, takich jak
std::placeholders,
std::string_literals,
std::chrono,
std::this_thread,
std::regex_constants
które można przynieść do użytku.
Przydatną techniką jest kompozycja przestrzeni nazw . Jeden definiuje niestandardową przestrzeń nazw do przechowywania przestrzeni nazw potrzebnych dla konkretnego .cpp
pliku i używania jej zamiast zestawu using
instrukcji dla każdej rzeczy w przestrzeni nazw, której możesz potrzebować.
#include <iostream>
#include <string>
#include <vector>
namespace Needed {
using std::vector;
using std::string;
using std::cout;
using std::endl;
}
int main(int argc, char* argv[])
{
/* using namespace std; */
// would avoid all these individual using clauses,
// but this way only these are included in the global
// namespace.
using namespace Needed; // pulls in the composition
vector<string> str_vec;
string s("Now I have the namespace(s) I need,");
string t("But not the ones I don't.");
str_vec.push_back(s);
str_vec.push_back(t);
cout << s << "\n" << t << endl;
// ...
Ta technika ogranicza ekspozycję na całość std:: namespace
( jest duża! ) I pozwala napisać czystszy kod dla najczęstszych linii kodu, które ludzie piszą najczęściej.
static
słowo kluczowe?