有没有更简单的方法来编写接受一组类型的概念?
Is there a simpler way to write a concept that accepts a set of types?
本质上,有没有一种 shorter/cleaner 方法可以定义 Alphabet
而不是使用一堆 std::same_as
/std::is_same
?
struct A {};
struct B {};
struct C {};
...
template <typename T>
concept Alphabet =
std::same_as<T, A> ||
std::same_as<T, B> ||
std::same_as<T, C> ||
...
您可以通过定义基数 class 并使用 std::is_base_of
来完成此(某种程度上),但为了这个问题,我们假设 A
、B
, C
,等不能修改
使用 Boost.Mp11,这是一如既往的简短 one-liner:
template <typename T>
concept Alphabet = mp_contains<mp_list<A, B, C>, T>::value;
或者可以遵循辅助概念(或辅助变量模板或任何辅助):
template <typename T, typename... Letters>
concept AlphabetImpl = (std::same_as<T, Letters> or ...);
template <typename T>
concept Alphabet = AlphabetImpl<T, A, B, C>;
但是,请注意 任何 除了痛苦的死记硬背之外的其他实现:
template <typename T>
concept Alphabet = same_as<T, A> or same_as<T, B> or same_as<T, C>;
导致包含方面的不同行为。这可能无关紧要,但它可能:
template <Alphabet T> void f(T); // #1
template <same_as<A> T> void f(T); // #2
f(A{}); // with the repeated same_as or same_as or ..., this calls #2
// with any other nicer implementation, ambiguous
本质上,有没有一种 shorter/cleaner 方法可以定义 Alphabet
而不是使用一堆 std::same_as
/std::is_same
?
struct A {};
struct B {};
struct C {};
...
template <typename T>
concept Alphabet =
std::same_as<T, A> ||
std::same_as<T, B> ||
std::same_as<T, C> ||
...
您可以通过定义基数 class 并使用 std::is_base_of
来完成此(某种程度上),但为了这个问题,我们假设 A
、B
, C
,等不能修改
使用 Boost.Mp11,这是一如既往的简短 one-liner:
template <typename T>
concept Alphabet = mp_contains<mp_list<A, B, C>, T>::value;
或者可以遵循辅助概念(或辅助变量模板或任何辅助):
template <typename T, typename... Letters>
concept AlphabetImpl = (std::same_as<T, Letters> or ...);
template <typename T>
concept Alphabet = AlphabetImpl<T, A, B, C>;
但是,请注意 任何 除了痛苦的死记硬背之外的其他实现:
template <typename T>
concept Alphabet = same_as<T, A> or same_as<T, B> or same_as<T, C>;
导致包含方面的不同行为。这可能无关紧要,但它可能:
template <Alphabet T> void f(T); // #1
template <same_as<A> T> void f(T); // #2
f(A{}); // with the repeated same_as or same_as or ..., this calls #2
// with any other nicer implementation, ambiguous