2016-03-30 17 views
6

tôi sẽ cố gắng giải thích những gì tôi đang cố gắng để làm:Làm thế nào để biết liệu hàm hiện tại có phải là một hàm thành viên thông thường hay một hàm tĩnh trong 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"; 
    } 
}; 

Tôi đang cố gắng để sửa đổi một định nghĩa logfile để nó chỉ ghi vào một dòng khi được sử dụng từ bên trong hàm thành viên của một lớp dựa trên đầu ra của hàm thành viên if_filter_applies().

Nếu LOGFILE được sử dụng từ bên ngoài lớp hoặc trong một hàm thành viên tĩnh, tôi muốn nó sử dụng hàm Global if_filter_applies() (luôn trả về true).

Mã trên không biên dịch, vì static void staticMem() kết thúc bằng cách sử dụng thành viên lớp if_filter_applies() thay vì toàn cầu.

Tôi không muốn tạo một định nghĩa khác tương tự như #define LOGFILE làm thay thế riêng cho các hàm thành viên tĩnh, vì có hàng trăm tệp trong mã của chúng tôi và tôi không muốn thay thế tất cả các lần xuất hiện theo cách thủ công.

Vì vậy, có bất kỳ thay đổi nào tôi có thể thực hiện cho #defile LOGFILE macro sao cho nó gọi số ::if_filter_applies() thay vì trong ngữ cảnh của hàm thành viên tĩnh?

+0

Hãy xem [this] (http://stackoverflow.com/questions/25863485/is-it-possible-to-bring-global-function-into-the-overload- giải quyết-với-thành viên? lq = 1) (có tôi cũng thất vọng) –

+0

Tại sao bạn muốn ** # defile ** LOGFILE của bạn: ( –

+0

Nó không thực sự là một tập tin đăng nhập cho trường hợp sử dụng của tôi, nó thực sự là một bộ đệm tròn Tôi chỉ thực hiện LOGFILE lên để giải thích vấn đề của tôi. :) – SidR

Trả lời

3

Nếu bạn đang sử dụng MS Visual Studio, bạn có thể sử dụng séc __if_exists chống lại this. Vì vậy, một cái gì đó như:

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

Cảm ơn câu trả lời! Thật không may, tôi không sử dụng MS Visual Studio. Có tương đương khác cho "__if_exists" không? – SidR

+0

Tôi thấy rằng tiếng kêu có một tùy chọn [-fms-extensions] (http://llvm.org/releases/3.0/docs/ClangReleaseNotes.html#windows) ... có thể cho phép thử .. – Buddy

+0

Cảm ơn. Có điều gì cho hệ thống Linux không? – SidR

Các vấn đề liên quan