Định hướng thuật ngữ "Hàm trợ giúp". Một định nghĩa là một chức năng tiện lợi mà bạn sử dụng tất cả thời gian chỉ để hoàn thành công việc. Chúng có thể sống trong không gian tên chính và có các tiêu đề riêng, v.v ... Định nghĩa hàm trợ giúp khác là một hàm tiện ích cho một lớp hoặc một lớp gia đình.
// 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
Bây giờ isPrinter
có sẵn cho bất kỳ mã bao gồm tiêu đề của nó, nhưng print_alignment_page
yêu cầu một lệnh
using namespace printer_utils::Xerox;
. Người ta cũng có thể tham khảo nó như là
Canon::print_alignment_page();
để rõ ràng hơn.
C ++ STL có std::
không gian tên bao gồm hầu hết tất cả các lớp và hàm của nó, nhưng nó chia chúng thành hơn 17 tiêu đề khác nhau để cho phép người viết mã lấy tên lớp, tên hàm, v.v. của riêng họ.
Trong thực tế, KHÔNG nên sử dụng using namespace std;
trong tệp tiêu đề hoặc, như thường được thực hiện, như dòng đầu tiên bên trong main()
. std::
là 5 chữ cái và thường có vẻ như là một việc vặt để nói trước chức năng mà người ta muốn sử dụng (đặc biệt std::cout
và std::endl
!) nhưng nó phục vụ một mục đích.
C ++ 11 mới có một số không gian tên phụ trong đó cho các dịch vụ đặc biệt như
std::placeholders,
std::string_literals,
std::chrono,
std::this_thread,
std::regex_constants
có thể được đưa vào sử dụng.
Một kỹ thuật hữu ích là thành phần không gian tên . Người ta định nghĩa một không gian tên tùy chỉnh để giữ các không gian tên bạn cần cho .cpp
tệp cụ thể của bạn và sử dụng không gian đó thay vì một loạt các using
câu lệnh cho mỗi thứ trong một không gian tên mà bạn có thể cần.
#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;
// ...
Kỹ thuật này hạn chế tiếp xúc với toàn bộ std:: namespace
( nó lớn! ) Và cho phép một người viết mã sạch hơn cho các dòng mã phổ biến nhất mà mọi người viết thường xuyên nhất.
static
từ khóa?