我希望使 inside 的存在member依賴dat于B(或其他一些概念)。
template <bool B>
struct dat {
void member_func() requires (B) {} //ok
std::byte member requires (B); //err
};
我知道這可能與專業化有關,但據我所知,如果需要多個不同的成員要求,那將變得非常難看。
如果沒有專業化,這種行為可能嗎?
uj5u.com熱心網友回復:
有幾種方法可以解決這個問題(參見Conditional Members)。
一種是您使用條件來更改 的型別member:
struct E { };
[[no_unique_address]] std::conditional_t<B, std::byte, E> member;
這不是真正的條件成員變數,member始終存在。但有時它是您關心的型別,有時它是一個不占用空間的空型別。這可能已經足夠好了 - 如果您實際上不必訪問該事物,并且沒有代碼取決于該成員的存在。
如果這不起作用,那么您必須求助于另一種專業。但是您不必專門化所有dat,只需一個有條件地提供此成員的基類:
template <bool B>
struct maybe_member {
std::byte member;
};
template <>
struct maybe_member<false> { };
template <bool B>
struct dat : maybe_member<B> {
void member_func() requires (B) {} //ok
};
在這里,有dat<true>一個名為member但dat<false>沒有資料成員的成員。這對于諸如(正如我提到的)之類的事情很重要。iterator_category
兩者都不是很好的解決方案,但兩者都絕對優于專門針對成員變數的整個類。如果需要有多個不同的、獨立的條件變數,則兩者都可以縮放。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/441480.html
下一篇:在C 中查找序列的基期
