问题标签 [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 的字符串被动态定制然后显示?
我的意思是这样的:
c++ - 这个 static_assert 会被触发吗?
关键是我认为这两个 static_assert* s * 永远不会被触发——即使有人也尝试过。
那么这个Q的答案是什么?
c++ - C ++ 11 - constexpr函数中的static_assert?
如何在函数static_assert
内正确执行 a constexpr
?例如:
这不是有效的 C++11 代码,因为 constexpr 函数必须只包含 return 语句。我不认为该标准对此有例外,尽管 GCC 4.7 不允许我编译此代码。
c++ - 有没有办法使用静态断言和类型特征防止一个类从两次派生?
我意识到这是一个人为的例子,但我想要一个编译检查来防止这种情况......
c++ - 如何使用静态断言和类型特征防止嵌套模板类型中的菱形图案?
我要防止的是不止一个基于 C 的模板在 D 中派生(即,应该只有一个 C 派生实例)。希望在 C 或 B 中可能有一个静态断言可以解决这个问题。
c++ - 我可以从手动模板实例化中排除一些方法吗?
我们有复杂的模板类,其中一些方法不适用于某些策略或类型。因此,当我们检测到这些类型时(在编译时,使用 type-traits),我们会触发一个带有不错消息的静态断言。
现在我们也做了很多手动模板实例化。部分原因是方法被迫编译器对方法进行语法检查。它还减少了库用户的编译时间。问题是静态断言总是被触发,因此我们不能手动实例化有问题的模板类。
有解决方法吗?
编辑:为了更清楚,这是一个例子(在这种情况下,显式实例化将在 someFunc1() 上失败:
EDIT2:这是另一个例子。这一次你可以编译它,看看我的意思。首先立即编译。代码应该编译。然后取消注释 [2]并且应该触发静态断言。现在注释掉 [2]并取消注释 [1]。静态断言将触发,因为您正在显式实例化模板。我想避免删除显式实例化,因为它带来了好处(参见上面的好处)。
c++ - 这个静态断言会正常工作吗?
我最近看到以下代码:
它会按预期工作(类似BOOST_STATIC_ASSERT)吗?
c++ - 获取类中静态属性的数量
我有一个仅由静态属性组成的类,充当一种穷人的单身人士。其目的是从应用程序的各个点收集统计信息。对于我们的单元测试,我创建了一个卷影副本,可用于获取生产代码之间的差异。
例子:
由于所有成员都是静态的,影子类不能从生产类继承,并且生产类中的属性是具有副作用的复杂对象,我只希望影子保存简单的值以进行比较。
为了使影子类更易于维护,我想添加一个静态断言来检查每当有人向生产类添加属性时,影子类也会更新。
如果属性不是静态的,这可以通过执行以下操作轻松完成:
除了使类成为非静态类(我不想这样做,因为我必须将生产类变成一个适当的单例)之外,有没有什么办法可以用当前的实现来完成这个检查?
在运行时,我有一个方法可以使用生产类验证阴影中的所有值。由于添加新属性时也必须更新该方法,因此我希望能够计算已验证的属性数量,并在数量与属性总数不同时断言。
例子
如果有一个 GCC 扩展,我可以使用这可能是一个可接受的解决方案,即使我更喜欢可移植的东西。
c++ - constexpr、static_assert 和内联
我之前根据参数是否为constexpr
. 我正在尝试解决该问题的令人失望的答案,以制作更智能的断言功能。这大致是我想要做的:
基本上,这个想法是编译时检查总是比运行时检查更好,如果可以在编译时检查。但是,由于内联和常量折叠之类的原因,我不能总是知道是否可以进行编译时检查。这意味着在某些情况下可能会assert (condition)
编译到assert(false)
并且代码只是在等待我运行它并在我发现有错误之前执行该路径。
因此,如果有某种方法可以检查条件是否为 constexpr(由于内联或其他优化),我可以static_assert
在可能的情况下调用,否则可以使用运行时断言。幸运的是,gcc 有内在函数,如果是 constexpr __builtin_constant_p (exp)
,它会返回 true 。exp
我不知道其他编译器是否有这个内在,但我希望这能解决我的问题。这是我想出的代码:
依赖于的static_assert
短路行为or
。如果IS_CONSTEXPR
为真,则static_assert
可以使用,条件为!true or condition
,与just 相同condition
。如果IS_CONSTEXPR
为假,则static_assert
不能使用,条件为!false or condition
,与 相同,true
忽略static_assert
。如果static_assert
由于不是 constexpr 而无法检查condition
,那么我会在我的代码中添加一个运行时assert
作为最后的努力。但是,这不起作用,因为不能在 a 中使用函数参数static_assert
,即使参数是constexpr
.
特别是,如果我尝试使用 gcc 编译会发生这种情况:
g++ main.cpp -std=c++0x -O0
一切正常,编译正常。没有没有优化的内联,所以IS_CONSTEXPR
是 false 并且static_assert
被忽略,所以我只得到一个运行时assert
语句(失败)。然而,
一旦我打开任何优化并因此可能static_assert
被触发,它就会失败,因为我不能在static_assert
. 有没有办法解决这个问题(即使这意味着实现我自己的static_assert
)?我觉得我的 C++ 项目理论上可以从一个更智能的断言语句中获得相当多的好处,该语句可以尽早发现错误。
在一般情况下,制作类似函数的宏似乎smart_assert
并不能解决问题。它显然可以在这个简单的示例中工作,但condition
可能来自调用图上两级的函数(但constexpr
由于内联,编译器仍然知道),这遇到了使用函数参数的相同问题在一个static_assert
。
c++ - static_assert 不能将 const char* 模板参数识别为 constexpr: g++ 错误?
考虑下面的定义。
完整的错误是
../main.cpp:16:3:错误:静态断言的非常量条件
../main.cpp:16:3: 错误:'(((const char*)(& Test::wrong_string)) == ((const char*)(& Test::right_string)))' 不是常量表达式
我相信这是一个编译器错误,因为根据我作为模板参数传递的内容(无论是还是)constexpr
,表达式的内在变化是没有意义的。static_assert
Test::right_string
Test::right_string
我已经发现 g++ 4.6在将地址作为模板参数处理时有些缺陷。这是同一错误的实例吗?