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

Das*_*kie 1 c++ c++-concepts c++20

本质上,有没有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> ||
    ...
Run Code Online (Sandbox Code Playgroud)

您可以通过定义基类并使用 来完成此操作(某种程度上)std::is_base_of,但为了解决这个问题,我们假设ABC等无法修改。

Bar*_*rry 5

使用 Boost.Mp11,这是一个简短的单行代码:

template <typename T>
concept Alphabet = mp_contains<mp_list<A, B, C>, T>::value;
Run Code Online (Sandbox Code Playgroud)

或者可以遵循辅助概念(或辅助变量模板或辅助任何东西):

template <typename T, typename... Letters>
concept AlphabetImpl = (std::same_as<T, Letters> or ...);

template <typename T>
concept Alphabet = AlphabetImpl<T, A, B, C>;
Run Code Online (Sandbox Code Playgroud)

然而,请注意除了令人痛苦的死记硬背之外的任何其他实现:

template <typename T>
concept Alphabet = same_as<T, A> or same_as<T, B> or same_as<T, C>;
Run Code Online (Sandbox Code Playgroud)

导致包容方面的不同行为。这可能并不重要,但可能:

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
Run Code Online (Sandbox Code Playgroud)