Disambiguare il termine "Funzione di aiuto". Una definizione è una funzione di convenienza che usi tutto il tempo solo per fare qualche lavoro. Possono vivere nello spazio dei nomi principale e avere le proprie intestazioni, ecc. L'altra definizione della funzione di supporto è una funzione di utilità per una singola classe o famiglia di classi.
// 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
Ora isPrinter
è disponibile per qualsiasi codice inclusa la sua intestazione, ma print_alignment_page
richiede una
using namespace printer_utils::Xerox;
direttiva. Si può anche fare riferimento come
Canon::print_alignment_page();
per essere più chiari.
Il C ++ STL ha lo std::
spazio dei nomi che copre quasi tutte le sue classi e funzioni, ma le suddivide categoricamente in oltre 17 diverse intestazioni per consentire al programmatore di togliere i nomi delle classi, i nomi delle funzioni, ecc. Se vogliono scrivere il loro.
In effetti, NON è consigliabile utilizzare using namespace std;
in un file di intestazione o, come spesso accade, come prima riga all'interno main()
. std::
è composto da 5 lettere e spesso sembra un lavoro ingrato prefigurare la funzione che si vuole usare (specialmente std::cout
e std::endl
!) ma serve a uno scopo.
Il nuovo C ++ 11 contiene alcuni spazi dei nomi secondari per servizi speciali come
std::placeholders,
std::string_literals,
std::chrono,
std::this_thread,
std::regex_constants
che può essere portato per l'uso.
Una tecnica utile è la composizione dello spazio dei nomi . Uno definisce uno spazio dei nomi personalizzato per contenere gli spazi dei nomi necessari per il proprio .cpp
file specifico e usarlo invece di un mucchio di using
istruzioni per ogni cosa in uno spazio dei nomi che potrebbe essere necessario.
#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;
// ...
Questa tecnica limita l'esposizione al tutto std:: namespace
( è grande! ) E consente di scrivere codice più pulito per le righe di codice più comuni che le persone scrivono più spesso.
static
parola chiave?