Laz*_*zer 6 c++ syntax templates metaprogramming
此语法用作此问题答案的一部分:
template <bool>
struct static_assert;
template <>
struct static_assert<true> {}; // only true is defined
#define STATIC_ASSERT(x) static_assert<(x)>()
Run Code Online (Sandbox Code Playgroud)
我不明白那种语法.它是如何工作的?
假设我这样做
STATIC_ASSERT(true);
Run Code Online (Sandbox Code Playgroud)
它被转换为
static_assert<true>();
Run Code Online (Sandbox Code Playgroud)
怎么办?
Ada*_*ura 13
STATIC_ASSERT(true);
Run Code Online (Sandbox Code Playgroud)
确实意味着
static_assert<true>();
Run Code Online (Sandbox Code Playgroud)
评估为空.static_assert<true>只是一个没有任何成员的空结构.static_assert<true>()创建该结构的对象,而不是将其存储在任何地方.
这简单地编译并且什么都不做.
另一方面
STATIC_ASSERT(false);
Run Code Online (Sandbox Code Playgroud)
手段
static_assert<false>();
Run Code Online (Sandbox Code Playgroud)
这导致编译错误.static_assert没有专业化false.所以使用一般形式.但一般形式如下:
template <bool>
struct static_assert;
Run Code Online (Sandbox Code Playgroud)
这只是一个结构的声明,而不是它的定义.因此static_assert<false>(),在尝试创建未定义的结构的对象时会导致编译错误.
static_assert<true>(); 这样做
template <>
struct static_assert<true> {}
Run Code Online (Sandbox Code Playgroud)
模板化结构专门化临时对象创建正在完成 - 对构造函数的调用以及稍后对析构函数的调用,两者都有望被优化器消除,因为它们什么都不做.因为只有一个专门化true而且没有通用版本的模板结构,所有评估的结构都static_assert<false>();将无法编译.
| 归档时间: |
|
| 查看次数: |
967 次 |
| 最近记录: |