Desambique o termo "função auxiliar". Uma definição é uma função de conveniência que você usa o tempo todo apenas para realizar algum trabalho. Eles podem viver no namespace principal e ter seus próprios cabeçalhos, etc. A outra definição de função auxiliar é uma função de utilitário para uma única classe ou família de classes.
// 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
Agora isPrinter
está disponível para qualquer código, incluindo seu cabeçalho, mas print_alignment_page
requer uma
using namespace printer_utils::Xerox;
diretiva. Pode-se também referi-lo como
Canon::print_alignment_page();
para ser mais claro.
O C ++ STL possui o std::
namespace que cobre quase todas as suas classes e funções, mas os divide categoricamente em mais de 17 cabeçalhos diferentes, para permitir que o codificador obtenha os nomes das classes, nomes de funções etc. fora do caminho, se quiserem escrever próprios.
De fato, NÃO é recomendável usar using namespace std;
em um arquivo de cabeçalho ou, como costuma ser feito, como a primeira linha dentro main()
. std::
tem 5 letras e muitas vezes parece uma tarefa anterior à função que se deseja usar (especialmente std::cout
e std::endl
!), mas serve a um propósito.
O novo C ++ 11 possui alguns sub namespaces para serviços especiais, como
std::placeholders,
std::string_literals,
std::chrono,
std::this_thread,
std::regex_constants
que pode ser trazido para uso.
Uma técnica útil é a composição do espaço para nome . Um define um espaço para nome personalizado para armazenar os espaços para nome que você precisa para seu .cpp
arquivo específico e usa-o em vez de várias using
instruções para cada coisa em um espaço para nome que você possa precisar.
#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;
// ...
Essa técnica limita a exposição ao todo std:: namespace
( é grande! ) E permite escrever código mais limpo para as linhas de código mais comuns que as pessoas escrevem com mais frequência.
static
palavra - chave?