C++概念:检查模板实例化
假设我有一个模板化类型,例如
template<typename A, typename B, typename C>
struct mytype { };
如何编写检查类型是否为该模板的实例化的概念?
template<typename T>
concept MyType = requires(T x) { ??? }
我想不出一种明显的方法来做到这一点,而不是解析为老式的专用检测器类型,或者可能是标记基础类型。
解决方案
使用C++17类模板参数演绎,应该可以这样做:
template<typename A, typename B, typename C>
struct mytype { };
template<class T>
concept C1 = requires(T x) {
{ mytype{x} } -> std::same_as<T>;
};
mytype{x}
使用类模板参数演绎来演绎A
、B
和C
,所以如果您可以从T
构造mytype<A, B, C>
,那么这是有效的。特别是,如果mytype
是可复制构造的,则这一点是有效的,因为您有一个隐式声明的copy-deduction guide类似于:
template <typename A, typename B, typename C>
mytype(mytype<A, B, C>) -> mytype<A, B, C>;
检查T
是否也是构造的mytype
实例化避免与其他扣除指南匹配,例如,这将匹配没有-> std::same_as<T>
的任何类型:
template <class A, class B, class C>
struct mytype {
mytype(A);
};
template <class A>
mytype(A) -> mytype<A, A, A>;
建议的解决方案不适用于不可复制构造的类,即使它应该可以使其适用于仅移动的类。
使用clang和gcc测试:https://godbolt.org/z/ojdcrYqKv
相关文章