繁体   English   中英

验证单元测试中的static_assert

[英]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_traittrue分支中触发软SFINAE错误,我实际上必须默认构造traits类的实例。 如果你编写你的traits类,所以它们不是默认可构造的,这将不起作用。 但总的来说,你不会那样写。 很想知道是否有更好的方法来做到这一点

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM