簡體   English   中英

c++ 20中如何靜態斷言該類型對於模板非類型參數是可行的

[英]How to static_assert that type is viable for template non-type parameter in c++20

我有一個類型TimeDuration 現在它是文字類型,我可以將它用作非類型模板參數。 這種用法與類型定義相距甚遠(編譯方式),因此如果有人修改TimeDuration使其不再是單獨的文字,那么稍后會注意到它。

所以我把static_assert(std::is_literal_type_v<TimeDuration>); 就在 class 定義之后。 但是, is_literal_type在 c++20 中被刪除。 我可以用什么代替它?

我知道C++17 中已棄用的 std::is_literal_type ,但答案基本上說我的問題不存在。

有一種非常簡單的方法可以獲取關於類型是否適合在非類型模板參數中使用的編譯錯誤:在 NTTP 中使用它。 如果不合適,編譯器會抱怨。

您可以輕松地在某處編寫一個小模板並使用您的類型顯式實例化它。 就像是:

template<auto val> struct checker{};

template struct checker<MyType(/*insert params for constexpr function here*/)>;

is_literal_type無論如何都不合適(這就是它消失的原因),因為作為文字類型並不像 C++20 的用戶定義 NTTP 規則那樣具有限制性。 是的,用戶定義的 NTTP 必須是文字類型,但它還必須具有許多其他特性。

如果您不關心模板簽名的唯一性(避免 std::is_same 與類),您可以簡單地通過 const 引用傳遞一個 TimeDuration 變量(或任何您想要的):

template <const auto& TimeDurationRef>
requires std::is_same_v<std::decay_t<decltype(TimeDurationRef)>, TimeDuration>
void foo();// or struct Foo {};

但是您不能通過即時臨時人員。 您需要將引用變量聲明為 static constexpr 以確保 static 存儲持續時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM