Розділіть термін "функція помічника". Одне визначення - це функція зручності, яку ви весь час використовуєте лише для того, щоб виконати якусь роботу. Вони можуть жити в головному просторі імен та мати власні заголовки тощо. Інше визначення функції помічника - це функція корисності для одного класу або сім'ї класів.
// 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
Тепер isPrinter
доступний будь-який код, включаючи його заголовок, але print_alignment_page
вимагає
using namespace printer_utils::Xerox;
директиви. Можна також згадати це як
Canon::print_alignment_page();
бути більш чітким.
STL C ++ має std::
простір імен, який охоплює майже всі його класи та функції, але він розбиває їх категорично на понад 17 різних заголовків, щоб дозволити кодеру отримувати імена класів, назви функцій тощо, якщо вони хочуть писати їхня власність.
Насправді НЕ рекомендується використовувати using namespace std;
у файлі заголовка або, як це часто робиться, у якості першого рядка всередині main()
. std::
- це 5 букв, і часто здається, що заздалегідь є передмовою функція, яку хочеться використовувати (особливо std::cout
і std::endl
!), але вона служить цілі.
У новому C ++ 11 є кілька просторів під імен для спеціальних служб, таких як
std::placeholders,
std::string_literals,
std::chrono,
std::this_thread,
std::regex_constants
які можна принести для використання.
Корисна методика - композиція простору імен . Один визначає спеціальний простір імен, щоб утримувати потрібні простори імен для вашого конкретного .cpp
файлу та використовувати його замість купу using
операторів для кожної речі в просторі імен, яка може знадобитися.
#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;
// ...
Ця методика обмежує експозицію в цілому std:: namespace
( вона велика! ) І дозволяє писати чистіший код для найпоширеніших рядків коду, які люди пишуть найчастіше.
static
ключове слово?