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 子句中使用变量模板即可。
有没有办法 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 子句中使用变量模板即可。