2016-03-30 16 views
6

Cercherò di spiegare quello che sto cercando di fare:Come dire se la funzione corrente è una funzione membro normale o statica in C++ 11?

bool if_filter_applies() {return true;} 

#defile LOGFILE if(if_filter_applies()) LOG_STREAM_OBJECT 

void globalFunc() { LOGFILE << "Some data \n"; } 

class C { 
    int a; 
    bool if_filter_applies() { 
     if (a == 1) 
      return true; 
     else 
      return false; 
     } 
public: 
    void regMem() { 
     LOGFILE << "Some data\n"; 
    } 
    static void staticMem() { 
     LOGFILE << "Some data\n"; 
    } 
}; 

sto cercando di modificare una definizione FILELOG in modo che scrive solo un flusso quando viene utilizzato dalla funzione membro di una classe basata su l'output della funzione membro if_filter_applies().

Se LOGFILE viene utilizzato dall'esterno della classe o in una funzione membro statica, voglio che utilizzi la funzione Global if_filter_applies() (che restituisce sempre true).

Il codice sopra riportato non viene compilato, poiché static void staticMem() termina utilizzando il membro della classe if_filter_applies() anziché quello globale.

Non voglio creare una definizione diversa simile a #define LOGFILE come una sostituzione specifica per le funzioni membro statiche, perché ci sono centinaia di file nel nostro codice e non voglio sostituire tutte le occorrenze manualmente.

Quindi ci sono delle modifiche che posso apportare alla macro #defile LOGFILE in modo che chiami ::if_filter_applies() invece nel contesto di una funzione membro statico?

+0

Date un'occhiata a [questo] (http://stackoverflow.com/questions/25863485/is-it-possible-to-bring-global-function-into-the-overload- risoluzione-con-membro? lq = 1) (sì, sono altrettanto deluso) –

+0

Perché vuoi ** # defilare ** il tuo LOGFILE :( –

+0

Non è davvero un file di registro per il mio caso d'uso, è in realtà un buffer circolare Ho appena creato LOGFILE per spiegare il mio problema :) – SidR

risposta

3

Se si utilizza MS Visual Studio, è possibile utilizzare il controllo __if_exists rispetto a this. Quindi, qualcosa di simile a:

__if_exists(this) 
{ 
    // In a member function 
} 
__if_not_exists(this) 
{ 
    // Not in a member function 
} 
+0

Grazie per la risposta! Sfortunatamente, non sto usando MS Visual Studio. Ci sono altri equivalenti per "__if_exists"? – SidR

+0

Vedo che clang ha un'opzione [-fms-extensions] (http://llvm.org/releases/3.0/docs/ClangReleaseNotes.html#windows) ... potrebbe dargli un assaggio .. – Buddy

+0

Grazie. C'è qualcosa per i sistemi Linux? – SidR

Problemi correlati