スポンサーリンク

| キーワード:

色々な型に対応できる関数を作る(2)配列/ポインタ版

前回の続き

構造体が渡されたときとは別に、ポインタや配列が渡されたときも特殊化する必要がある。

配列用の特殊化

プライマリテンプレートが以下の時、

//プライマリテンプレート
template<typename T>
struct GETTER;

ポインタ、配列、std::arrayで別の特殊化が必要

ポインタ版

相手がポインタの場合、それを配列とみなすとする。


特殊化は以下のようになる。

template<typename T>
struct GETTER<T*> {
  // ... 
};

配列版


相手が配列の場合、ポインタとは別の特殊化が必要になる

template<class T, std::size_t N>
struct GETTER<T[N]> {
  // ...
};

std::array版


相手がstd::arrayの場合の特殊化は以下

template<typename T, std::size_t N>
struct GETTER<std::array<T, N> > {
  // ...
};

実装例

#include <type_traits>

#include <array>

#include "len.hpp"

template<typename T> struct GETTER<T*> { using arg_t = T*; using carg_t = const T*; static inline double& X(arg_t v) { return v[0]; } static inline double& Y(arg_t v) { return v[1]; } static inline double& Z(arg_t v) { return v[2]; } static inline const double& X(carg_t v) { return v[0]; } static inline const double& Y(carg_t v) { return v[1]; } static inline const double& Z(carg_t v) { return v[2]; } };

template<class T, std::size_t N> struct GETTER<T[N]> { using arg_t = T[N]; using carg_t = const T[N]; static inline double& X(arg_t v) { return v[0]; } static inline double& Y(arg_t v) { return v[1]; } static inline double& Z(arg_t v) { return v[2]; } static inline const double& X(carg_t v) { return v[0]; } static inline const double& Y(carg_t v) { return v[1]; } static inline const double& Z(carg_t v) { return v[2]; } };
 
template<typename T, std::size_t N> struct GETTER<std::array<T, N> > { using arg_t = std::array<T, N> &; using carg_t = const std::array<T, N> &; static inline double& X(arg_t v) { return v[0]; } static inline double& Y(arg_t v) { return v[1]; } static inline double& Z(arg_t v) { return v[2]; } static inline const double& X(carg_t v) { return v[0]; } static inline const double& Y(carg_t v) { return v[1]; } static inline const double& Z(carg_t v) { return v[2]; } };

//エントリポイント int main() { double L; vec_t vv; vv.x = 1; vv.y = 1; vv.z = 1; L = length(vv); std::cout << L << std::endl;
//配列 double xyz[3]; xyz[0] = 1; xyz[1] = 1; xyz[2] = 1; L = length(xyz); std::cout << L << std::endl;

//ポインタ double *pxyz = new double[3]; pxyz[0] = 1; pxyz[1] = 1; pxyz[2] = 1; L = length(pxyz); std::cout << L << std::endl;

//std::array std::array<double, 3> ary; ary[0] = 1; ary[1] = 1; ary[2] = 1; L = length(ary); std::cout << L << std::endl;

int i; std::cin >> i; }

コメントを残す

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

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


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