Overload/specialization 个概念

Overload/specialization of a concept

有没有办法 overload/specialize 像模板这样的概念?

考虑以下非常简单的情况,我们只想将某些类型标记为 'simple':

// overload/specialization for MyClass - WOULD BE NICE - BUT FAILS

template <typename T>
concept simple = false;

class MyClass;
template <>
concept simple<MyClass> = true;

// workaround, rather verbose - SUCCEEDS

template <typename T>
concept simple = Info<T>::is_simple;

template <typename T>
struct Info
{
    static inline constexpr bool is_simple = false;
};    

class MyClass;
template <>
struct Info<MyClass>
{
    static inline constexpr bool is_simple = true;
};

有没有更简单的方法来实现这个?

Is there a way to overload/specialize concepts like templates?

没有。您不能超载或专门化概念。概念就是它们。这是设计使然。

如果我有一个概念Frobnable,那个概念总是意味着它的意思。模板专业化的根本问题在于,专业化实际上与主模板没有任何关系。我们只是喜欢......为了理智起见,确保它们是。除非我们不这样做,例如 vector<bool> 对于所有其他 T.

并不真正具有与 vector<T> 相同的界面

但是,如果 Frobnable<T> 的含义与 Frobnable<T*> 完全不同(或在此处插入您选择的专业化),那么您不可能对概念包含的含义提出任何规则- 或者真的对概念进行了很多推理。

概念比模板更结构化


所以回到你的问题

[...] we just want to flag certain Types as 'simple':

你应该为此使用一个变量模板,然后可能有一个概念只是参考那个变量模板。

template <typename T>
inline constexpr bool is_simple = false;

template <>
inline constexpr bool is_simple<MyClass> = true;

template <typename T>
concept simple = is_simple<T>::value;

或者根本不用理会这个概念,直接在 requires 子句中使用变量模板即可。