我有以下代碼:
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;
};
現在,我想添加另一個專門用于檢測 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
}
uj5u.com熱心網友回復:
std::rank標準庫中已經有一個 trait 呼叫,所以解決方案非常簡單:
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;
}
}();
};
uj5u.com熱心網友回復:
只需為多維陣列添加一個特化:
template<class T, std::size_t N1, std::size_t N2>
struct detect_carray<T[N1][N2]>{
constexpr static int kind=multi_carray;
};
然后
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
居住
順便說一句:對于double[3][5],T將會double(并且N1將會是3,N2將會是5)。因為std::complex<double>[3][5][8][16],T將會std::complex<double> [8][16](并且N1將會是3并且N2將會是5)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/371193.html
