【问题标题】:How to get template of std::array?如何获取 std::array 的模板?
【发布时间】:2020-04-16 07:29:47
【问题描述】:

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

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++11 metaprogramming


    【解决方案1】:

    您可以比较类型:

    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 {};
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-03
      • 2015-05-19
      • 2021-10-11
      • 2021-05-17
      • 1970-01-01
      • 2012-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多