如何在模板专业化中检测C风格的多维数组?

Pav*_*Dev 1 c++ templates c++17 c++20

我有以下代码:

enum type_kind{unkown=-1,carray, multi_carray};

template<class T>
struct detect_carray{
   constexpr static int kind=unkown;
};
template<class T, std::size_t N>
struct detect_carray<T[N]>{
   constexpr static int kind=carray;
};
Run Code Online (Sandbox Code Playgroud)

现在,我想添加另一个专门用于检测 C 风格的多维数组的专业化,即T[a][b]....

实现此目的的语法是什么?我可以使用可变参数模板吗?

我期望以下行为:

int main()
{
std::cout<<detect_carray<std::vector<int>>::kind;//-1
std::cout<<detect_carray<int[3]>::kind;//0
std::cout<<detect_carray<double[3][5]>::kind;//1
std::cout<<detect_carray<std::complex<double>[3][5][8][16]>::kind;//1
//Correct out: -1011
}
Run Code Online (Sandbox Code Playgroud)

Pat*_*rts 5

标准库中已经有一个被调用的特征std::rank,所以解决方案非常简单:

template <class T>
struct detect_carray {
  enum type_kind { unknown = -1, carray, multi_carray };

  static constexpr int kind = [] {
    switch (std::rank_v<T>) {
      case 0: return unknown;
      case 1: return carray;
      default: return multi_carray;
    }
  }();
};
Run Code Online (Sandbox Code Playgroud)