概念的重载/专业化

问题描述

是否可以重载/专业化模板之类的概念?

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

// 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;
};

有没有更简单的方法来实现这一目标?

解决方法

是否可以重载/专业化模板之类的概念?

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

如果我有一个概念Frobnable,则该概念始终表示其含义。模板专业化的根本问题在于,专业化实际上与主专业无关。我们只是...为了理智起见,请确保它们是。除非我们不这样做,否则像vector<bool>的其他所有vector<T>的界面实际上都不与T相同。

但是,如果Frobnable<T>的含义与Frobnable<T*>完全不同(或在此处插入您选择的专业化内容),那么您就不可能为概念归类的含义提出任何规则-或根本上根本就没有概念。

概念比模板更具结构性。


所以回到您的问题

[...]我们只想将某些类型标记为“简单”:

您应该为此使用变量模板,然后可能会有一个概念只是引用该变量模板。

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;

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...