为其他容器实现std::rank

Implementing std::rank for other containers

本文关键字:std rank 实现 其他      更新时间:2023-10-16

解释:

std::rank只适用于c风格的数组。

因此,我为工作良好的std::vector实现了类似的rank

#include <iostream>
#include <vector>
template<typename Type, Type val>
  struct integral_constant
  {
    static constexpr Type value =val;
  };
  template<typename>
    struct rank
    : public integral_constant<std::size_t, 0> { };
  template<typename Type>
    struct rank< std::vector<Type> >
    : public integral_constant<std::size_t, 1 + rank<Type>::value> { };
    template<class T>
   constexpr size_t vector_dimentions(T)
    {
         return rank<T>::value ;
    }
int main()
{
    std::vector<std::vector<std::vector<int>>> vec;
    std::cout<<vector_dimentions(vec) << 'n';
}

表意

问题:

现在我想把它推广到其他容器,比如std::list,。。。

因此,我将结构定义更改为:

  template<template<typename>class Container,typename Type>
    struct rank< Container<Type> >
    : public integral_constant<std::size_t, 1 + rank<Type>::value> { };

表意

但现在它给出了错误的答案(总是0(!

我认为在这种情况下,它无法推导出正确的结构,因为它现在有2个模板参数。正确吗?!我该如何解决?

在KerrekSB的帮助下,我找到了解决方案:

template <typename> struct prank : std::integral_constant<std::size_t, 0> {};
template <template <typename...> class C, typename ...Args>
struct prank<C<Args...>>
: std::integral_constant<
    std::size_t,
    1 + prank<typename C<Args...>::value_type>::value> {};
template <typename U, typename V>
struct prank<std::pair<U, V>>
: std::integral_constant<std::size_t, 1 + prank<V>::value> {};
template <typename... Args>
struct prank<std::tuple<Args...>>
: std::integral_constant<std::size_t, 1> {};
template <typename T,typename... Args>
struct prank<std::tuple<T,Args...>>
: std::integral_constant<std::size_t, prank<T>::value+prank<std::tuple<Args...>>::value> {};

Videone