BOOST_STATIC_ASSERT without boost

前端 未结 6 1212

Since boost is forbidden in a company I work for I need to implement its functionality in pure C++. I\'ve looked into boost sources but they seem to be too complex to unders

6条回答
  •  广开言路
    2020-11-30 03:05

    Here is my own implementation of static assertions extracted from my code base: Pre-C++11 Static Assertions Without Boost.

    Usage:

    STATIC_ASSERT(expression, message);

    When the static assertion test fails, a compiler error message that somehow contains the STATIC_ASSERTION_FAILED_AT_LINE_xxx_message is generated.

    message has to be a valid C++ identifier, like no_you_cant_have_a_pony which will produce a compiler error containing:

    STATIC_ASSERTION_FAILED_AT_LINE_1337_no_you_cant_have_a_pony :)

    #define CONCATENATE(arg1, arg2)   CONCATENATE1(arg1, arg2)
    #define CONCATENATE1(arg1, arg2)  CONCATENATE2(arg1, arg2)
    #define CONCATENATE2(arg1, arg2)  arg1##arg2
    
    /**
     * Usage:
     *
     * STATIC_ASSERT(expression, message)
     *
     * When the static assertion test fails, a compiler error message that somehow
     * contains the "STATIC_ASSERTION_FAILED_AT_LINE_xxx_message" is generated.
     *
     * /!\ message has to be a valid C++ identifier, that is to say it must not
     * contain space characters, cannot start with a digit, etc.
     *
     * STATIC_ASSERT(true, this_message_will_never_be_displayed);
     */
    
    #define STATIC_ASSERT(expression, message)\
      struct CONCATENATE(__static_assertion_at_line_, __LINE__)\
      {\
        implementation::StaticAssertion((expression))> CONCATENATE(CONCATENATE(CONCATENATE(STATIC_ASSERTION_FAILED_AT_LINE_, __LINE__), _), message);\
      };\
      typedef implementation::StaticAssertionTest CONCATENATE(__static_assertion_test_at_line_, __LINE__)
    
      // note that we wrap the non existing type inside a struct to avoid warning
      // messages about unused variables when static assertions are used at function
      // scope
      // the use of sizeof makes sure the assertion error is not ignored by SFINAE
    
    namespace implementation {
    
      template 
      struct StaticAssertion;
    
      template <>
      struct StaticAssertion
      {
      }; // StaticAssertion
    
      template
      struct StaticAssertionTest
      {
      }; // StaticAssertionTest
    
    } // namespace implementation
    
    
    STATIC_ASSERT(true, ok);
    STATIC_ASSERT(false, ko);
    
    int main()
    {
      return 0;
    }
    

提交回复
热议问题