[英]Verify static_assert in a unit test
我想确保static_assert在单元测试中正常工作。 也就是说,如果我有一个
class MyClass {static_assert(my_type_trait<T>::value, "error"); };
然后在单元测试MyClass<TypeWithTrait> myClass;
应该'传递'和MyClass<TypeWithoutTrait> myClass;
应该“失败”。
可以这样做吗?
如果要检查某些内容无法编译,则必须在代码外部进行测试。 只需编写一个简单的文件:
#include "MyClass.h"
int main() {
MyClass<%T%> m;
}
并编写一个单元测试,用不同的%T%
值编译该文件。 验证编译是否按预期成功,或者在失败文本中按预期失败并显示有关static_assert
的内容。
Barry的建议是一种可能性,但是如果你想要测试很多东西,你需要创建许多小文件。 更重要的是,这些文件可能由于其他原因而无法编译而无法满足您的预期,从而让您错误地认识到测试通过了。
另一种方法是,不使用static_assert
,而是使用某种SFINAE来检测某些东西是否有效。 对于traits类,这有点棘手,但你可以这样做:
template <class T>
using void_t = void;
template <class T>
struct foo;
template <>
struct foo <double> {};
template <class T, class = void>
struct has_foo_trait : std::false_type {};
template <class T>
struct has_foo_trait<T, void_t<decltype(foo<T>{})>> : std::true_type {};
int main(int, char**) {
std::cerr << has_foo_trait<int>::value;
std::cerr << has_foo_trait<double>::value;
return 0;
}
打印出01
。 所以现在,不是直接从static_assert
中获得硬故障,而是可以在编译时计算特征存在的值,然后在static_assert
中获得您期望的值。
请注意,traits类很棘手的原因是因为trait被声明为一般模板,只是没有定义。 所以做直接在void_t
中使用类型的“通常”元编程事情是行不通的。 为了在has_foo_trait
的true
分支中触发软SFINAE错误,我实际上必须默认构造traits类的实例。 如果你编写你的traits类,所以它们不是默认可构造的,这将不起作用。 但总的来说,你不会那样写。 很想知道是否有更好的方法来做到这一点
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.