问题标签 [static-assert]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 通过 static_assert 强制执行模板类型
我试图了解 的用处static_assert
,我想知道它是否可以帮助我执行设计,如果可以,如何。
我有一个通用模板类,它将自己的实现隐藏在另一个模板类中,该模板类根据模板类型的大小部分专门化。以下是此设计的简要概述:
仅当HelperT
的专门化支持 size of 时才支持Foo。例如,和都受支持。但是,假设用户尝试构建一个. 通常,这会产生错误,因为未定义Helper for的专业化,这是预期的行为。Foo<long>
Foo<unsigned long>
Foo<bool>
bool
有没有什么方法可以static_assert
在这个设计中使用来为这个界面的用户提供更多有用的错误?
此外,我还想限制用户使用特定类型,即使大小可能是正确的。例如,Foo<float>
不应该被允许。现在,我知道执行此操作的唯一方法是通过文档中的粗体注释。:)
c++11 - 位域和 C++11 static_assert
我们都知道位域不是很便携,因此应该避免引用 C99 标准 6.7.2.1/10 -“结构和联合说明符”;
实现可以分配任何大到足以容纳位域的可寻址存储单元。如果有足够的空间剩余,紧跟在结构中另一个位域之后的位域将被打包到同一单元的相邻位中。如果剩余空间不足,则将不适合的位域放入下一个单元还是与相邻单元重叠是实现定义的。单元内位域的分配顺序(高位到低位或低位到高位)是实现定义的。未指定可寻址存储单元的对齐方式。
然而; 在处理硬件设备等时,通常必须处理特定的位布局,如果没有位域,这意味着讨厌和不可读(至少在我看来)位摆弄代码。
所以我想做的是使用位域,但是我想首先验证编译器生成的位域布局实际上符合我的期望。所以我正在做的是编写一些静态断言,在这种情况下,布局不匹配失败。
例如; 一个简单的大小断言;
这很有魅力,并确保位域始终具有正确的大小,但是由于位域的实现特定性质,我不能假设位域内部的布局是否正确。所以我想做的是,静态断言位域的布局;
所以这个测试,应该检查当前位是否在正确的位置。- 但是,当尝试编译上述代码时,使用 GCC v4.8.1 会产生此错误消息;
使用 Clang v3.1 会产生此错误消息;
这表明我不允许读取联合的格式字段,当它通过原始字段初始化时。那么有什么办法可以解决这个问题吗?
c# - 如何使用代码合同在 C# 中进行编译时断言?
根据这个答案, C# 现在有“代码合同”,应该可以使用,而不是 C++ 编译时断言。现在我有了这个神奇的代码:
这需要IntPtr
与 的大小相同Int32
。所以我想要一个编译时断言——就像这个 C++ 代码
所以我尝试了以下方法:
我通过false
,Assert()
所以它肯定会失败,但编译通过就好了。
那么如何使用代码契约来进行编译时断言呢?
c++ - 在可能的情况下扩展为 static_assert 的断言宏?
我有一些通用代码需要对成员函数的结果运行断言。这个成员函数可能是constexpr
,也可能不是。
因为t.member_function()
可能是一个常量表达式,所以我想知道在这种情况下是否可以将其视为 a static_assert
,否则默认为 normal assert
。这可能吗?
c++ - decltype(常量表达式变量)
为什么 constexpr 变量的 decltype 失败?
c++ - 如何在编译时检查结构的大小?
我想添加在编译期间检查结构大小以确保它是预定义大小的代码。例如,当我移植此代码或在编译期间从结构中添加/删除项目时,我想确保此结构的大小为 1024 字节:
我知道如何在运行时使用如下代码来执行此操作:
但是如果我在运行时这样做是浪费处理。我需要在编译期间执行此操作。
在编译过程中如何做到这一点?
c++ - 如何静态检查可变参数模板参数列表中是否存在类型 T
我正在尝试静态检查可变参数模板参数列表中是否存在类型。但是,此模板列表实际上存在于传递单一类型的类中。此处的答案显示了如何检查参数列表或参数包,但我不确定如何测试包含可变参数模板的类。
例如
我可以在这个 static_assert 中写什么来确保检查对这个服务定位器的每个调用,并且如果使用服务内的模板参数列表中不存在的类型调用 Resolve,则会引发编译器错误?
我特别关注的是:
c++ - const int[2] 可以简单复制吗?
我有一个模板化的成员函数,它看起来有点像以下:
然后我以如下方式调用此函数:
当我使用 Visual Studio 2012 编译它时,我没有收到任何错误消息,并且程序的功能是我所期望的(即数据按位发送),但是,当使用最新版本的编译器 Visual Studio 2013 编译时,静态断言失败,编译器向我发出声明:
那么哪个版本的编译器是符合标准的,是否应该const int[2]
可以轻松复制?
编辑:这是 Visual Studio 2013 的错误;这是Microsoft Connect 报告
c++ - 关于对象大小的“static_assert”的更好消息
我一直在大量使用static_assert
(以及标准化之前的变体)。我相信我们中的许多人都将它们用于确保敏感数据结构的大小在跨平台和配置时保持不变。例如:
现在,我编写了一个方便的宏来帮助这个特殊用途:
像这样使用:
产生这个输出:(在编译时,显然,以编译错误的形式)
“SizeSensitiveClass”的大小与预期值不匹配。
这很好,但我想知道我是否可以扩展这个宏的实现(保持接口完整)以输出数据结构的当前大小和预期大小。理想情况下,输出应该类似于:
“SizeSensitiveClass”的大小与预期值不匹配(20 对 18)。
即使是目前的尺寸也会非常方便。这可能吗?
我正在使用 VC12 (Visual C++ 2013) 和 GCC 4.8.1。我很感激任何至少可以移植到这两个的解决方案/技术/方法。
我应该提到我已经尝试过常见的“字符串化”技巧,但它不起作用(正如人们所期望的那样)。它只是sizeof(T)
在输出中产生文字字符串。
我有一个模糊的概念,这可能是使用constexpr
s (生成消息字符串)来实现的,但我不熟悉它们。
c++ - static_assert 意外行为
我的类有一个重载operator&
,如果参数是指针,我会在其中执行静态断言。
如果我使用此运算符,即使类型绝对不是指针,我也总是会得到断言。std::cout << "is_pointer : " << std::is_pointer<T>::value << std::endl;
正在打印零...
例子。