夜行録 - 酔歩.net

日暮れて道遠し さらに夜道を行く もって夜行録と名付く

valarray の cast 再び

valarray に cast が使えない件。
数値演算してると実数割る実数を整数に、とか、実数割る整数を実数に、とかやりまくるんだけどなー。 valarray の operator は型が合ってないと使えない。じゃ cast すればってーと1要素毎に cast するしかない。 ちょー使えない。
だったら関数として作用する cast でも用意しとけよなーと思う

いらっと来たので自分で書く
個々の要素を cast して回るだけ…のところで transform を使うと… static_cast は関数ではなくて予約語だという罠。 なので関数オブジェクトとして使えない(template library を作る - 組み込み関数ラッパ)。

こんなの書けばなんとなく cast できるけど……、意味あんのか?

  1. template <typename T, typename H>
  2. class _static_cast : public std::unary_function<T, H> {
  3. public:
  4. T operator() (H &#38;val) {
  5. return static_cast<T>(val);
  6. }
  7. };
  8. template <typename T, typename H>
  9. std::valarray<T> valarray_cast(std::valarray<H> &#38;val) {
  10. std::valarray<T> res(val.size());
  11. std::transform(&#38;val[0], &#38;val[val.size()-1], &#38;res[0], _static_cast<T, H>() );
  12. return res;
  13. }

object の生成・コピー・破棄が入るので無駄に遅いはず。メリットは、式が簡単に書けるくらいか?

2010年06月03日 (Thu) - 19:11:35 - その他雑記 - 170x - permalink
Karma points: 2. Do you like this article? [yes/no]