使用 requires 子句使成员变量仅有条件地存在

Having a member variable only conditionally present using requires clause

我希望 datmember 的存在依赖于 B(或其他一些概念)。

template <bool B>
struct dat {
    void member_func() requires (B) {} //ok
    std::byte member requires (B); //err
};

我知道这可能与专业化有关,但据我所知,如果多个不同的成员要求是必要的,那将变得非常丑陋。

如果没有专业化,这种行为是否可能?

有几种解决方法(参见 Conditional Members)。

一个是你用条件改变member的类型:

struct E { };
[[no_unique_address]] std::conditional_t<B, std::byte, E> member;

这不是真正的条件成员变量,member 始终存在。但有时它是您关心的类型,有时它是一个没有 space 的空类型。这可能已经足够好了 - 如果您实际上不需要访问该内容,并且没有代码依赖于该成员的存在。

如果这不起作用,那么您必须求助于其他类型的专业化。但是您不必特化所有 dat,只需特化一个有条件地提供此成员的基础 class:

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 (as I mention).

之类的事情很重要

这两个都不是很好的解决方案,但两者都绝对胜过必须专门化 整个 class 只是为了以成员变量为条件。如果需要有多个不同的、独立的条件变量,两者都可以缩放。