【发布时间】:2021-07-30 09:37:30
【问题描述】:
给定一组 C++ 概念:
concept A = ...;
concept B = ...;
concept C = ...;
还有一组脚踏实地的非模板类型:
class ProcessA;
class ProcessB;
class ProcessC;
是否有一种惯用的方式来编写元函数get_matching_type,这样:
std::is_same_v<get_matching_type<TypeThatSatisfiesA>, ProcessA>;
std::is_same_v<get_matching_type<TypeThatSatisfiesB>, ProcessB>;
std::is_same_v<get_matching_type<TypeThatSatisfiesC>, ProcessC>;
全部成立?基本上,如何将 C++ 概念映射到 C++ 类型。
我看到的唯一简单方法是: 1/ 通过条件句的重叠,例如类似:
using get_matching_type = std::conditional_t<A<T>, ProcessA,
std::conditional_t<B<T>, ProcessB,
std::conditional_t<C<T>, ProcessC>
>
>;
但我想要一个不会使模板实例化深度超过屋顶的函数。
2/ 通过专业化:
template<A T>
struct get_matching_type<T> { using type = ProcessA; };
template<B T>
struct get_matching_type<T> { using type = ProcessB; };
template<C T>
struct get_matching_type<T> { using type = ProcessC; };
但是样板文件穿过屋顶:)
【问题讨论】:
-
为什么需要这个?如果你的概念只匹配一种类型,那为什么它是一个概念呢?
-
不,我的概念可以匹配任意数量的类型。例如:所有带有 { float 值的结构体; } 成员。但是对于满足这一点的所有类型(并且可能来自我之外的代码库),我可以应用一个实际操作。
标签: c++ c++20 c++-concepts