Ho ridefinito alcune funzioni matematiche (in modo che siano più veloci, meno precisi o utilizzare i modelli). Metto queste funzioni in un namespace e funzionano bene.C++: nascondendo alcune funzioni
Capita spesso, però, che mi dimentico di chiamare funzioni dal mio spazio dei nomi (ad esempio: ho dimenticato di scrivere mymath::cos
o using mymath::cos;
quando voglio chiamare cos
), ed è abbastanza difficile per scoprire dove ho dimenticato (fino ora l'ho scoperto solo con il profiling).
Dato che
- ho solo includono standard di
math.h
ocmath
intestazioni all'interno della mia intestazione di matematica, e che - ho bisogno di includere le intestazioni matematiche standard (perché alcune delle mie funzioni sono solo wrapper per lo standard uno, e voglio loro di essere in linea o che stanno su modelli),
c'è un modo portatile per nascondere funzione matematica standard in modo che venga segnalato un errore di compilazione, se vengono utilizzate funzioni matematiche globali (ovvero: senza uno spazio dei nomi)?
Una soluzione potrebbe essere mettere un using namespace mymath;
nella parte inferiore del mio file di intestazione matematica, ma questa soluzione non sembra così grande: rompe l'intero scopo dei namespace; Preferirei dover dire esplicitamente se usare una funzione da mymath
o da std
in modo che io sia costretto a scegliere tra un fester o una funzione più accurata senza il rischio di dimenticarlo.
EDIT:
Molte risposte dire che se uso cos
dal namespace globale (senza utilizzare né std
mymath
), e comprendono cmath
(e non math.h
), la compilazione dovrebbe fallire.
non so cosa dice la norma su di esso, ma:
#include <cmath>
int main() {
cos(M_PI);
return 0;
}
compila bene con GNU GCC (g++
) 4.5.1 (e versioni precedenti).
Hai ragione riguardo all'EDIT: "Non è specificato se questi nomi siano stati dichiarati per la prima volta all'interno dell'ambito dello spazio dei nomi globale e siano quindi iniettati nello std dei nomi mediante esplicite use-dichiarazioni". – ybungalobill