VCのabs と 定数

abs(-4); を*1 Release ビルドしたところで、ちっとも定数になってくれなくてショック。 いやまぁ、実行時に評価されるようなコード吐かれたところで数ステップ増えるだけなので、気にするようなレベルじゃないんですが……


いやでもなんか悔しいよね。(ぉ


仕方ないので、static_abs を 構造体テンプレートを使って書いてしまった。

コードを乗せては見た物の、ぶっちゃけ皆普通に書いてるんだろうなぁ。^^;


template<int VALUE, bool b>
struct inner_static_abs
{   // VALUE < 0
    enum{ value = -VALUE };
};
template<int VALUE>
struct inner_static_abs<VALUE, true>
{   // VALUE >= 0
    enum{ value = VALUE };
};
template<int VALUE>
struct static_abs
{
    enum { value = inner_static_abs<VALUE, VALUE >= 0>::value };
};

↑を書いてから飯食ってる時に気づいた


template<typename T>
inline T my_abs(T t)
{
    return t < 0 ? -t : t;
}

こっちの方が判りやすい && 汎用性ありまくりなのかしらーーーー!!!!!!! orz



はっはっは

最初から判ってたのかしらー! "あえて" クラスtemplate*2 使ったコード書いただけなのかしらー! 絶対なのかしらーーー!!

*1:正確には、コンパイル時定数を投げた

*2:クラスなん?