首页 > 解决方案 > 如何获取 std::array 的模板?

问题描述

我编写了一个简单的元程序来检查 2 个模板是否相同。这里是:

template<template<class...> class _Tp, template<class...> class _Up> 
struct is_same_template : std::false_type {};

template<template<class...> class _Tp> 
struct is_same_template<_Tp, _Tp> : std::true_type {};

它有效(但不适用于 std::array)

is_same_template<std::vector, std::vector>::value // 1
is_same_template<std::map, std::map>::value       // 1
is_same_template<std::vector, std::map>::value    // 0

is_same_template<std::vector, std::array>::value  // Error: type/value mismatch at argument 2

我该如何解决?

标签: c++c++11metaprogramming

解决方案


您可以比较类型:

template<class T1, class T2> struct is_same_template: std::false_type {};

template<template<class, std::size_t> struct StdArray,
         class T1, std::size_t n1, class T2, std::size_t n2>
struct is_same_template<StdArray<T1, n1>, StdArray<T2, n2>>: std::true_type {};

或为每个模板签名定义一个单独的比较器:

template<template<class, std::size_t, class...> class T1,
         template<class, std::size_t, class...> class T2>
struct is_same_template_T1_n1: std::false_type {};

template<> struct is_same_template_T1_n1<std::array, std::array>: std::true_type {};

一般来说,没有通用的模板接口可以同等地接受类型参数和非类型参数。


推荐阅读