C++概念:检查模板实例化 [英] C++ Concepts: checking for template instantiation

查看:14
本文介绍了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}使用类模板参数演绎来演绎ABC,所以如果您可以从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>;

建议的解决方案不适用于不可复制构造的类,即使它应该可以使其适用于仅移动的类。


使用测试:https://godbolt.org/z/ojdcrYqKv

这篇关于C++概念:检查模板实例化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆