使用 requires 子句使成员变量仅有条件地存在
Having a member variable only conditionally present using requires clause
我希望 dat
中 member
的存在依赖于 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 只是为了以成员变量为条件。如果需要有多个不同的、独立的条件变量,两者都可以缩放。
我希望 dat
中 member
的存在依赖于 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 只是为了以成员变量为条件。如果需要有多个不同的、独立的条件变量,两者都可以缩放。