Sto cercando di mettere in discussione la correttezza del mio codice sul seguente esempio minimalista in cui un file di intestazione solleva un identificatore nello spazio dei nomi corrente.Corrispondenza spazio dei nomi
#include <string>
namespace mine {
using std::string; // std::string lifted into mine
struct agent
{
string name;
};
}
Questo è un suggerimento che ho fatto di recente come un'altra alternativa all'utilizzo di un typedef:
#include <string>
struct agent
{
private:
typedef std::string string;
public:
string name;
};
ho considerato la prima opzione più corretta dal momento che fa uso del mio proprio spazio dei nomi e questo è un pratica a cui ci si dovrebbe abituare (quella della creazione e gestione dello spazio dei nomi). Nel frattempo, dato che l'identificatore viene sollevato all'interno di uno spazio dei nomi che controllo, rende questo un approccio sicuro.
Tuttavia, ho dei ripensamenti. Per uno, l'uso incauto del namespace mine, con una direttiva using, ad esempio, porterà anche std :: string in vista. Un altro problema è che sto esponendo troppo std :: string. Forse anche per le aree del namespace mine dove non è necessario o desiderabile.
Mi sembra più corretto lavorare sempre con lo scopo più basso possibile e lavorare da lì. Esporre solo l'assolutamente necessario. Il fatto che io abbia reso privato typedef nel secondo esempio era esattamente per questo. Ma poi non seguo il mio consiglio con il secondo esempio.
Ma d'altra parte, le mie preoccupazioni risultato dal fatto che qualcuno possa abusare del namespace miniera di:
using namespace mine;
A prima vista, sappiamo che questo non è un modello di utilizzo corretto per uno spazio dei nomi. Ma non si può negare che ci siano casi in cui potrebbe essere desiderabile. Quanto ritieni valido il primo approccio?
Assolutamente! In ogni caso l'esempio serve quei casi in cui l'autore ha troppi tipi da dichiarare all'interno di una classe e desidera semplificare la loro digitazione. Ho sentito di dare il consiglio sbagliato con il primo esempio. Ma vorrei alcuni pensieri, dal momento che std :: string è piuttosto innocuo. –
Immagino di non essere chiaro di cosa stai veramente chiedendo. Ma osserverei che in C++ gli spazi dei nomi non sono strumenti di progettazione, quindi se si hanno molti problemi nello spazio dei nomi, probabilmente ci sono troppi spazi dei nomi. –