c++ - 为其他容器实现 std::rank

标签 c++ templates c++11 metaprogramming template-meta-programming

解释:

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

ideone

问题:

现在我想将它推广到其他容器,如 std::list ,...

所以我将结构定义更改为:

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

ideone

但是现在它给出了错误的答案(总是 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> {};

ideone

关于c++ - 为其他容器实现 std::rank,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24222427/

相关文章:

c++ - emacs:类和结构的不同缩进

c++ - 从 CDialog 派生的 Dialog 在 DoModal (MFC/C++) 之后返回 -1

c++ - 有效地索引 "Hash"值集

c++ - 如何将 CRTP 与可变参数模板一起使用?

c++ - 如何通过保持性能来管理封装

c++ - 使用 unordered_map 确定子数组索引失败的函数

c++ - C++ 的持续集成服务器 - 库依赖项怎么样?

c++ - 在模板中输出嵌套类

c++ - 抛出不能正常工作

c++ - 推导成员函数和变量的模板参数