C++ Concepts: checking for template instantiation(C++概念:检查模板实例化)
本文介绍了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
这篇关于C++概念:检查模板实例化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
织梦狗教程
本文标题为:C++概念:检查模板实例化
基础教程推荐
猜你喜欢
- CString 到 char* 2021-01-01
- 为什么派生模板类不能访问基模板类的标识符? 2021-01-01
- 为什么 RegOpenKeyEx() 在 Vista 64 位上返回错误代码 2021-01-01
- 非静态 const 成员,不能使用默认赋值运算符 2022-10-09
- 初始化列表*参数*评估顺序 2021-01-01
- GDB 显示调用堆栈上函数地址的当前编译二进制文 2022-09-05
- 如果我为无符号变量分配负值会发生什么? 2022-01-01
- 通过引用传递 C++ 迭代器有什么问题? 2022-01-01
- 为什么 typeid.name() 使用 GCC 返回奇怪的字符以及如 2022-09-16
- 我应该对 C++ 中的成员变量和函数参数使用相同的名称吗? 2021-01-01
