gpt4 book ai didi

C++ 概念 : checking for template instantiation

转载 作者:行者123 更新时间:2023-11-30 00:43:28 25 4
gpt4 key购买 nike

假设我有一个模板化类型,例如

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 , BC ,所以如果你能构造一个 mytype<A, B, C> ,这是有效的来自T .特别是,如果 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++ 概念 : checking for template instantiation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54182239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com