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++概念:检查模板实例化


基础教程推荐
猜你喜欢
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- 运算符重载的基本规则和习语是什么? 2022-10-31
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- 设计字符串本地化的最佳方法 2022-01-01
- C++,'if' 表达式中的变量声明 2021-01-01
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01