[英]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.