簡體   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