消除术语“助手功能”的歧义。一个定义是一种便利功能,您一直在使用它来完成某些工作。它们可以存在于主命名空间中,并具有自己的标头等。另一个帮助器函数定义是单个类或类族的实用程序函数。
// 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
关键字?