Однозначный термин «вспомогательная функция». Одним из определений является удобная функция, которую вы используете постоянно, просто чтобы выполнить какую-то работу. Они могут жить в основном пространстве имен и иметь свои собственные заголовки и т. Д. Другое определение вспомогательной функции - это служебная функция для одного класса или семейства классов.
// 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();
чтобы быть более понятным.
C ++ STL имеет 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
ключевом слове?