【西加加】模板虽奇,难如上青天

本文记录了摸模板的心路历程,卖惨自闭随处可见。

模板匹配机制

若干个重要的模板匹配规则。

  • 类模板特化
  • 模板的偏特化

模板的偏特化是指需要根据模板的某些但不是全部的参数进行特化。

最优化的优于次特化的,即模板参数最精确匹配的具有最高的优先权。

非模板函数具有最高的优先权。如果不存在匹配的非模板函数的话,那么最匹配的和最特化的函数具有高优先权。

is_instance_of<TB, TA> 判断复杂参数表模板

C++ 11 提供了std::is_base_of(<type_trait) 来判断一个类是否为另一个类的基类。而对于复杂模板参数的类型而言,想判明是否相同只能通过 C++ 模板特化的参数预测特性。具体代码实现如下:

1
2
3
4
5
template <typename Instance, template <typename ...> class T>
struct is_instance_of : std::false_type {};

template <typename... Args, template <typename ...> class T>
struct is_instance_of<T<Args ...>, T> : std::true_type {};

❔ 其中<T<Args ...>, T> 巧妙地通过用 Args 来初始化相同类型,将拥有相同参数表的类型匹配到 std::true_type 上,否则为 std::false_type

最后再暴露一个接口用于表达式:

1
2
template <typename Instance, template <typename...> class T>
constexpr bool is_instance_of_v = is_instance_of<Instance, T>::value;
Share