2016-04-28 50 views
1

我有一個接口,其中每個函數的內容都是用一個大宏創建的。如果程序員正在添加一個新函數,並忘記將該函數添加到接口類中,它會創建很多編譯錯誤,這會使實際錯誤分心。如何在編譯時聲明一個函數是特定類的成員

在編譯時斷言是否可以使用這個特定宏的函數是特定類的成員? C++ 03或Boost功能可用。

#define MACRO_OF_THE_DOOM(...) assertion_here(); do_something(); 

class A { 
    void functionA(); 
    void functionB(); 
}; 

// This is valid usage 
void A::functionA() { 
    MACRO_OF_THE_DOOM(1, 2, 3, 4, 5); 
} 

// This should give an understandable compile error, which tells 
// definition should be A::functionB() 
void functionB() { 
    MACRO_OF_THE_DOOM(6, 7, 8); 
} 
+4

所以這樣做的真正原因是你在實現它們的時候會忘記用'A ::'作爲前綴的函數嗎?你有沒有嘗試' - 牆'? –

+0

@BartekBanachewicz在這種情況下,我認爲static assert會比'-Wall'更好,因爲在編譯器警告之前會顯示編譯錯誤。我也對這是否在理論上可能與靜態斷言有關感興趣。 –

+0

@BartekBanachewicz此外,似乎我使用的編譯器沒有這種問題的警告。 –

回答

1

您可以使用BOOST_STATIC_ASSERT

#define MACRO_OF_THE_DOOM(...) { assertion_here(); do_something(); } 

assertion_here() { BOOST_STATIC_ASSERT(false); } 
class A { 
    assertion_here() { // no-op } 
    void functionA(); 
    void functionB(); 
}; 

這種情況有解決一些注意事項可能利用周圍被type_traits工作,但這種解決方案可能足以滿足大多數情況下。

1

Would it be possible to assert at compile time, that a function that uses this particular macro is a member of specific class?

如果提供給你(我明白你不能使用c + + 11),那麼我建議TTI Library。下面是例子與評論:

http://coliru.stacked-crooked.com/a/66a5016a1d02117c

#include <iostream> 

#include <boost/tti/has_member_function.hpp> 
#include <boost/static_assert.hpp> 

BOOST_TTI_HAS_MEMBER_FUNCTION(functionA) 
BOOST_TTI_HAS_MEMBER_FUNCTION(functionB) 

class A { 
public: // must be public for tti 
    void functionA(); 
    //void functionB(); 
};  

int main() 
{ 
    // prints 1 
    std::cout << has_member_function_functionA< 
     A, // class type to check 
     void, // function return type 
     boost::mpl::vector<> >::value // parameter list 
     << std::endl; 

    // Below generates no compile error - prints 0 
    std::cout << has_member_function_functionB< 
     A, // class type to check 
     void, // function return type 
     boost::mpl::vector<> >::value // parameter list 
     << std::endl; 

    // Below static assertion, will fail at compile time  
    BOOST_STATIC_ASSERT(
     (has_member_function_functionB<A,void,boost::mpl::vector<> >::value)); 

} 

我已經更新,以使其符合C++ 03,遺憾的是靜態斷言沒有C++ 11產生相當criptic消息:

main.cpp: In function 'int main()': 
main.cpp:32:5: error: invalid application of 'sizeof' to incomplete type 'boost::STATIC_ASSERTION_FAILURE<false>' 
    BOOST_STATIC_ASSERT(
    ^
main.cpp:32:5: error: template argument 1 is invalid 
    BOOST_STATIC_ASSERT(
    ^
相關問題