有没有更简单的方法来编写接受一组类型的概念?

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 来完成此(某种程度上),但为了这个问题,我们假设 AB , 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