问题标签 [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++ - 如何在编译时检查两种类型是否相同(如果它与 Boost strong typedef 一起使用则加分)
我想知道是否可以在编译时检查两种类型是否相同。我想出的是(idk,如果它有效,因为它感觉很hackish并且IDK标准很好,所以IDK在测试时要寻找什么)。
用法 :
所以
1)有更好的方法吗?
2)这个函数hack的地址是否保证按标准工作(我敢打赌不是:))?
c++ - 编译时等效的 std::cout,或 c++11 中编译时常量值的 static_assert 字符串化
有没有办法在编译时打印 aconstexpr
或d 值的值?#define
我想要相当于std::cout <<
, 或某种方式来做类似的事情
编辑:我可以用 s 做一些基本的编译时打印constexpr
,至少在 gcc 上做一些类似的事情
这给了我error: incomplete type ‘display_non_zero_int_value<1>’ used in nested name specifier static_assert(v == 0 && display_non_zero_int_value<v>::foo, "v == 0");
。(另一方面,icpc 不太有用,只是说error: incomplete type is not allowed
)有没有办法编写一个可以概括这一点的宏,以便我可以做类似的事情
并以某种方式收到涉及 4 的错误消息?
c++ - 用于检查编译时常量的静态断言未传递给宏
前言:
ASSERT_FOR_DEFAULT
是一个宏,它将显示一个(自定义)断言对话框,以报告命中“默认情况”。是的,这个宏用于运行时断言,而不是编译时断言。但是,我只需要这样,任何常量值(编译时)都不能传递给这个宏。
问题:
以下应该在编译时失败:
是的,程序员可以在任何地方使用它,而不仅仅是default
在switch-case
. 他也可以使用任何未使用的表达式switch
。但这不是问题。只需要将非常量传递给这个宏。
没有为这个宏写任何重要的东西,假设它是ASSERT
/ assert
。
我尝试过使用模板(使用它们其他 SFINAE/静态断言!)、数组(如strcpy_s
)、拥有的结构YES
、NO
类型等等。但是找不到解决办法!
我正在使用VC2008。我知道static_assert
等decltype
,但不能使用 C++0x。
编辑(解决方案):
感谢 Arne Mertz 提出的这个可爱的建议。我从中得出了解决方案。
noConstAllowed
为所有T&
类型重载,如果传递了常量值,将调用另一个重载。两者都有不同的返回类型,因此检查大小。模板版本返回 a bool
,它满足任何传递的变量的断言,并且对于任何常量或表达式都失败(因为返回类型将为int
)。
c++ - 在 static_assert() 编译时显示整数
这是我正在尝试做的简化版本
但是我希望能够在断言消息中打印 First::nbElementFirstEnum 和 Second::nbElementSecondEnum 的值(就像在显然不起作用的注释版本中一样)。我尝试使用带有“#”的宏连接。我还尝试使用可变参数模板,使用 %10 检索每个数字并将“0”字符添加到检索到的值中,但我得到的只是一个 constexpr char[]。
所以我的问题是如何让我的枚举值打印在字符串文字中。
可能的重复:
最有趣的主题是这个: 在编译时打印 sizeof(T) 但我不想有警告,也不想删除代码来了解这些值。
c++ - 用于检测模板特化的模板元函数
受这个问题的启发,我想知道是否可以引入一些编译时检查来检测两个给定的模板实例:
是从相同的定义构造的,或者如果它们是从Templ
模板的不同特化构造的
所以基本上假设的模板函数的行为是这样的:
有可能创建这种元功能吗?
c++ - 如果我不实例化类,模板类构造函数中的 static_assert 是否应该触发?
由于以下原因,以下代码无法在 GCC 中编译static_assert
:
但是,相同的代码在 Visual Studio 2012 中编译。如果我实际实例化该类,我只会收到编译错误(此外,如果我将类设为非模板化,则会触发 static_assert 而不实例化该类)。
哪个编译器的行为符合标准?我认为是 GCC,但我在标准中看不到明确的确认。
c++ - 安全删除 C++ 隐藏的虚拟警告
我从 Sun C++ 5.10 编译器收到关于我正在更改的某些现有代码中的隐藏虚拟方法的编译警告。无论出于何种原因,作者都没有为给定的数据类型实现函数的覆盖。我在这里重现了这种情况:
该类Concrete
未实现void visit( Triangle& obj ) {}
,这导致以下错误消息:
该代码工作正常,但删除此警告消息会很好。因此,我想实现该功能,以使编译器满意,但不能使用它 - 最好在编译时检测到 - 因为目前显然没有必要。
有没有办法实现编译断言以允许编译但阻止使用?我无权访问 Boost 或 C++11。
c++ - Eclipse CDT 错误地标记了 C++ 静态类型检查 (BOOST)
所以,我想使用 BOOST 库来静态检查我的模板是否被某些基类使用,例如:
所以,我想使用BOOST_STATIC_ASSERT( ( boost::is_base_of<DesiredBaseClass, T>::value ) )
,这适用于 GCC。然而,Eclipse 对此非常恼火,它会列出错误(来自它自己的解析器)。
错误是:
有谁知道阻止 Eclipse 抱怨的好方法?我可以关闭它的解析器,但我认为它通常很擅长解决问题。
c++ - c++ 如何在编译时创建我自己的警告
我想在编译时而不是在预处理器中创建自己的警告(因为我已经看到了一些答案)假设我们有:
现在如果用户这样做:
A first;
接着:
A second(first);
他会得到一个错误,即未实现复制构造或其他什么......请记住我的代码中有很多继承......以及将我引向 H 文件 A 是在其中实现的,而不是我尝试过的地方使用复制构造函数...
所以..而不是编译器的默认警告,我想创建自己的.. 类似..“你不能使用复制构造函数”
帮助?谢谢!
c++ - 如何用宏做static_assert?
我试图使用这个建议来做一个静态断言,但如果我在模板的方法中使用它,我不会收到编译错误。
示例如下:
我用 g++ 4.7.2 编译它,并警告说 C++ ISO 不支持 VLA:
那么,为什么在模板方法中使用 STATIC_ASSERT 时编译不会失败?有没有办法让它失败?
注意:我需要一个 c++98(甚至可能是 c++03)解决方案,如果可能的话,只能使用宏。