美文网首页
C++11:static_assert

C++11:static_assert

作者: fck_13 | 来源:发表于2020-01-10 23:08 被阅读0次

(1) 为什么会提出static_assert?
有人希望使用断言来限制模板的实例化。在static_assert之前,可用的断言工具有两个:

  • assert
  • #error
    但是assert是在运行期使用的,#error是在translation期间使用的,而实例化是在编译器进行的,所以,现有的这两个断言工具都无法满足要求。
    (2)如何使用?
    语法:
static_assert ( constant-expression  ,  string-literal ) ; //C++11
static_assert ( constant-expression );//C++17

(3)代码示例

  • namespace scope
// At namespace scope, the static_assertion declaration
// may be used as an alternative to the #error preprocessor
// directive.
//
static_assert(sizeof(long) >= 8, "64-bit code generation not enabled/supported.");
  • class scope
template <class CharT, class Traits = std::char_traits<CharT> >
class basic_string 
{
  static_assert(tr1::is_pod<CharT>::value, "Template argument CharT must be a POD type in class template basic_string");
  // ... 
}; 

block scope

#include <sys/param.h> // for PAGESIZE
class VMMClient 
{
public:
  int do_something()
  {
    struct VMPage 
    {
      // ...
    };
    static_assert(sizeof(VMPage) == PAGESIZE, "Struct VMPage must be the same size as a system virtual memory page.");
    // ...
  } 
  // ...
}; 

double-checking complicated compile-time computation results

template <class T>
class A
{
private:
    struct impl_1 {...};
    struct impl_2 {...};
    static const unsigned sz1 = sizeof(impl_1) < sizeof(impl_2) ? sizeof(impl_2) : sizeof(impl_1);
    static const unsigned sz2 = sizeof(T);
    static const unsigned sz3 = sz1 + (sz2-1) & ~(sz2-1);
    struct impl 
    {
        union 
        {
            impl_1 a;
            impl_2 b;
        };
        
        T data_[sz3];
        
        static_assert(sizeof(data_) >= sizeof(impl_1), "Design error:  Assumption compromised");
        static_assert(sizeof(data_) >= sizeof(impl_2), "Design error:  Assumption compromised");
    };
};

double-checking design assumptions

template <class T, bool>
class container_impl 
{
    static_assert(!std::tr1::is_scalar<T>::value, "Implementation error: this specialization intended for non-scalars only");
    // ...
};

template <class T>
class container_impl<T, true> 
{
    static_assert(std::tr1::is_scalar<T>::value, "Implementation error: this specialization intended for scalars only");
    // ...
};

template <class T>
class container : private container_impl<T, std::tr1::is_scalar<T>::value> 
{
        // ...
};

相关文章

网友评论

      本文标题:C++11:static_assert

      本文链接:https://www.haomeiwen.com/subject/rwveactx.html