C++には T[N] 形式の他に、
・std::array
・std::vector
・std::valarray
等の配列の形式がある。このうちstdの<type_traits>で判別できるのはT[N]型か否かを判別するstd::is_arrayしか用意されていないようなので、その他を判別するテンプレートを用意する。
#include <iostream> #include<vector> #include<array> #include<valarray> int primarray[10]; std::array<int, 10> stdarray; std::vector<int> vectordata; std::valarray<int> valarraydata; namespace CheckPrimitiveArray { // type_traits内に同様のものがある
template<class> struct is_array :std::false_type {}; template<class T> struct is_array<T[]> : std::true_type {}; template<class T, std::size_t N> struct is_array<T[N]> : std::true_type {};
void example() { std::cout << std::endl; std::cout << "--- is_array" << std::endl; std::cout << "primitive:" << is_array<decltype(primarray)>::value << std::endl; std::cout << "stdarray :" << is_array<decltype(stdarray)>::value << std::endl; std::cout << "vector :" << is_array<decltype(vectordata)>::value << std::endl; std::cout << "valarray :" << is_array<decltype(valarraydata)>::value << std::endl; } } namespace CheckVectorArray {
template<class> struct is_vector : std::false_type {};
template<class T, class ALLOCATOR> struct is_vector<std::vector<T, ALLOCATOR>> : std::true_type {};
void example() { std::cout << std::endl; std::cout << "--- is_vector" << std::endl; std::cout << "primitive:" << is_vector<decltype(primarray)>::value << std::endl; std::cout << "stdarray :" << is_vector<decltype(stdarray)>::value << std::endl; std::cout << "vector :" << is_vector<decltype(vectordata)>::value << std::endl; std::cout << "valarray :" << is_vector<decltype(valarraydata)>::value << std::endl; } } namespace CheckStdArray {
template<class> struct is_stdarray :std::false_type {}; template<class T, std::size_t N> struct is_stdarray<std::array<T, N>> :std::true_type {};
void example() { std::cout << std::endl; std::cout << "--- is_stdarray" << std::endl; std::cout << "primitive:" << is_stdarray<decltype(primarray)>::value << std::endl; std::cout << "stdarray :" << is_stdarray<decltype(stdarray)>::value << std::endl; std::cout << "vector :" << is_stdarray<decltype(vectordata)>::value << std::endl; std::cout << "valarray :" << is_stdarray<decltype(valarraydata)>::value << std::endl; } } namespace CheckValArray {
template<class> struct is_valarray : std::false_type {};
template<class T> struct is_valarray<std::valarray<T>> : std::true_type {};
void example() { std::cout << std::endl; std::cout << "--- is_valarray" << std::endl; std::cout << "primitive:" << is_valarray<decltype(primarray)>::value << std::endl; std::cout << "stdarray :" << is_valarray<decltype(stdarray)>::value << std::endl; std::cout << "vector :" << is_valarray<decltype(vectordata)>::value << std::endl; std::cout << "valarray :" << is_valarray<decltype(valarraydata)>::value << std::endl; } } int main() { CheckPrimitiveArray::example(); CheckStdArray::example(); CheckVectorArray::example(); CheckValArray::example(); getchar(); }
--- is_array
primitive:1
stdarray :0
vector :0
valarray :0
--- is_stdarray
primitive:0
stdarray :1
vector :0
valarray :0
--- is_vector
primitive:0
stdarray :0
vector :1
valarray :0
--- is_valarray
primitive:0
stdarray :0
vector :0
valarray :1