如何解决概念的重载/专业化
是否可以重载/专业化模板之类的概念?
考虑以下非常简单的情况,我们只想将某些类型标记为“简单”:
// 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子句中使用变量模板。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。