2016-03-30 7 views
6

postaram się wyjaśnić, co próbuję zrobić:Jak stwierdzić, czy bieżąca funkcja jest regularną czy statyczną funkcją członka w 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"; 
    } 
}; 

Próbuję zmodyfikować definicję LOGFILE tak, że tylko pisze do strumienia, gdy używane od wewnątrz funkcji składowej klasy w oparciu o wyjście funkcji składowej if_filter_applies().

Jeśli funkcja LOGFILE jest używana spoza klasy lub funkcji statycznej, chcę, aby używała funkcji Global if_filter_applies() (która zawsze zwraca wartość true).

Powyższy kod nie został skompilowany, ponieważ static void staticMem() kończy się przy użyciu elementu klasy if_filter_applies() zamiast globalnego.

Nie chcę tworzyć innej definicji podobnej do #define LOGFILE jako zamiennika specjalnie dla funkcji statycznych, ponieważ w naszym kodzie są setki plików i nie chcę ręcznie wymieniać wszystkich wystąpień.

Czy są jakieś zmiany, które mogę wprowadzić w celu uzyskania makro w kontekście funkcji statycznego członka?

+0

Zapraszamy do obejrzenia [to] (http://stackoverflow.com/questions/25863485/is-it-possible-to-bring-global-function-into-the-overload- rozdzielczość-z-członkiem? lq = 1) (tak jestem równie rozczarowany) –

+0

Dlaczego chcesz ** # zbezcześcić ** twój LOGFILE :( –

+0

To tak naprawdę nie jest plik dziennika dla mojego przypadku użycia, to jest faktycznie Okrągły bufor Właśnie stworzyłem LOGFILE, aby wyjaśnić mój problem :) – SidR

Odpowiedz

3

Jeśli używasz MS Visual Studio, możesz użyć sprawdzenia __if_exists przeciwko this. Więc coś takiego:

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

Dzięki za odpowiedź! Niestety nie używam MS Visual Studio. Czy istnieją inne odpowiedniki "__if_exists"? – SidR

+0

Widzę, że clang ma opcję [-fms-extensions] (http://llvm.org/releases/3.0/docs/ClangReleaseNotes.html#windows) ... może dać to spróbować .. – Buddy

+0

Dzięki. Czy jest coś dla systemów Linux? – SidR

Powiązane problemy