スポンサーリンク

| キーワード:

C++ templateで配列の種類を特定する

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

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: