问题标签 [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.

0 投票
3 回答
5610 浏览

c++ - 如何检查模板参数是否为 2 的幂?

我想创建一个静态分配2^N 字节数组的结构,但我不希望此结构的用户将此大小指定为指数。例子:

我如何检查此模板参数是否为 2 的幂,通过有关此的好消息警告用户?

我已经能够使用一个简单的模板来检查这一点:

但是,我无法用理智的消息警告用户。有任何想法吗?

编辑

修正了模棱两可的例子。

编辑

1 确实是 2 的幂。解决了这个问题!:)

编辑

使用 BOOST_STATIC_ASSERT,我在 GCC 中收到此代码的编译错误:

错误

http://ideone.com/cMfEf

编辑

哦,我明白了。这是断言失败时我应该得到的消息。但这并没有给用户一些理智的信息。:(

0 投票
2 回答
2721 浏览

c++ - C++11 static_assert(以及其中使用的函数)

static_assert与模板一起似乎是一个非常好的功能。

但是,我很难在标准库中找到用于在编译时进行各种测试的函数。

例如,我正在寻找一个函数来检查一个类型是否是另一个类型的子类型。boost::is_base_of但是,这项工作是 std 中的一个类似功能,所以我不需要依赖 boost。

基本上,是否有一个很好的函数列表可以在static_assertC++11 标准库中使用并包含在其中?

什么时候static_assert执行?我可以将它放在模板中的任何位置并针对每个模板实例进行评估吗?它可以用来将模板参数限制为类的特定子类型吗?

0 投票
2 回答
5476 浏览

c++ - C++11 static_assert:参数化错误消息

我之前的问题中,我想使用 static_assert 将模板参数限制为特定的子类型。问题得到解答,存档代码如下:

现在,我想让错误信息更简洁。即,我想说明哪种类型违反了此约束。例如,如果类A不是派生自Y并且有人实例化X<A>,则错误消息应打印“类型参数必须从 Y 派生,但A不是”。

这是否可以通过标准库以某种方式实现?

我看到了两个挑战:

  • 在编译时组装字符串而不使用 boost::mpl
  • 检索 T 实例化的类型的名称。名称应该有意义,理想情况下与违规定义中使用的名称相同。我试过 typeid(T).name() 但它只返回不可接受的损坏名称。我记得有某种宏可以返回某物的名称,但我想不起来了。
0 投票
1 回答
818 浏览

c++ - 静态断言检查静态常量类数据成员?

我有几个带有“静态常量”数据成员的类。我想知道如何在编译时使用 static_assert 检查它们的值。我可以将 static_assert 直接放在类体中吗?(将我的 static_assert 放在每个构造函数中并不是很实用。)

0 投票
1 回答
730 浏览

c++ - 是否应该使用 typedef 触发 static_assert?

我注意到当实例化被typedef'ed 时,类模板中的静态断言不会被触发。

此代码编译没有错误。如果我尝试创建一个实例,则断言失败:

最后,如果我用 替换条件false,即使我没有实例化类模板,断言也会失败:

我在 gcc-4.5.1 和 gcc-4.7.0 上尝试了这段代码。这种行为正常吗?编译器应该在什么时候验证静态断言?我想涉及到两阶段查找,但是 typedef 不应该触发第二阶段吗?

0 投票
0 回答
600 浏览

c++ - 在 VS2010 中,是否可以使用 static_assert 来验证关于变量从类开始的偏移量的假设?

这是一个简化的示例:

现在假设 A 类可以通过 MyClass 的基类使用 MyClass 功能的子集,我想做的是验证关于“m_class”相对于 A 类实例的位置的假设。

我在 B 类的成员函数中尝试了以下代码,但它给出了错误(“预期的常量表达式”):

对于当前版本的编译器来说,这是否过于雄心勃勃?

0 投票
2 回答
1531 浏览

c++ - 如果可能,静态断言,否则动态断言?

假设我有一个模板函数,它接受一个整数和一个对类型 T 实例的 const 引用。现在根据整数,只有一些 T 是可接受的,否则在运行时会引发异常。

如果此函数的所有使用都使用常量整数,则可以使 int 成为模板参数并使用静态断言来检查它是否可以接受。所以不是func(1,c)一个人会使用func<1>(c)并且会获得编译时类型检查。有什么方法可以编写func(1,c)并保持编译时检查,同时还可以编写func(i,c)和使用动态断言?目标是使其对开发人员透明。添加这种安全性而无需为诸如编译时常量之类的事情打扰开发人员就太好了。他们可能只记得func(1,c)总是有效并使用它,避免检查。

如何尽可能使用静态断言和动态断言定义函数?


以下代码显示了Ivan Shcherbakov的 GCC 解决方案:

这将只允许 i=0 和 T=float 的组合。对于其他组合,一个好方法是创建一个宏,该宏产生template<> func(const int& i, const T& t)替换 T 和 i != 0 的代码。

0 投票
5 回答
12389 浏览

c++ - 如何将static_assert与sizeof和stringify结合起来?

内存使用在我的应用程序中非常关键。因此,我有特定的断言,在编译时检查内存大小,如果大小与我们之前认为正确的大小不同,则给出一个 static_assert 。

我已经定义了一个这样的宏:

这个宏使得写这个很容易:

问题是,当这个 static_assert 关闭时,可能很难找出新的大小应该是多少(例如,通过使用隐藏的编译器选项“/d1 reportAllClassLayout”)。如果我可以包括实际尺寸会更方便,所以而不是:

书的尺寸不正确!

它会显示

书的尺寸不正确!(预期 144,大小为 152)

我试着写这样的东西:

但是您不能在函数调用中使用字符串化 (#) 运算符。

我还尝试添加双字符串化技巧,如下所示:

但不是打印size is 152,而是打印size is sizeof(Book).

有没有办法在 static_assert 中对 sizeof 的结果进行字符串化?

0 投票
2 回答
1217 浏览

c++ - 在模板中指定允许的参数

我可以准确地指定模板可以接收什么样的参数吗?例如,我想创建一个模板,该模板只能用属于或扩展类的类来实例化A。在 Java 中,泛型通过以下方式支持这一点:

可以用 C++ 中的模板实现类似的功能吗?

0 投票
4 回答
4961 浏览

c++ - 何时使用 `static_assert` 而不是 SFINAE?

我一直在使用(并且看到使用)static_assert来标记模板参数值的不需要的值。但是,对于我遇到的所有情况,通过 SFINAE 禁用那些不需要的值似乎更好、更优雅。

例如:

代替:

所以我的问题是:我应该什么时候使用static_assert而不是 SFINAE,为什么?

编辑:

我认为到目前为止我学到的内容如下:

1. SFINAE 是一种通用且功能强大但可能非常复杂的工具,可用于许多任务,包括函数重载解析(有些人似乎认为这是它的唯一目的)。

2. SFINAE 可以在任何可能的地方以相对简单的方式使用static_assert,除了它出现在(类或函数的)声明中而不是它的定义中(或者可以在static_assert类前向声明​​中插入一个?) . 这使得更逐字,因此更清晰的代码。然而,由于 SFINAE 很复杂,它往往比简单的static_assert.

3.另一方面static_assert,编译器错误消息更清晰,有些人似乎认为这是两者的主要目的。