toge's diary

コンピュータ関連の趣味をつらつらと。

Minmaxクラス

相変わらずしょうもないものを作るのが大好きなのです。

template<typename T>
class MinMax;

template<typename T>
class MinMax2
{
public:
  MinMax2(MinMax<T>& raw) : raw_(raw){}

public:
  MinMax2& operator,(typename boost::call_traits< T >::param_type data)
  {
    if (data < raw_.min)
      raw_.min = data;
    else if (data > raw_.max)
      raw_.max = data;
    return *this;
  }

public:
  MinMax<T>& raw_;
};

template<typename T>
class MinMax
{
public:
  MinMax(){};

public:
  MinMax& operator=(typename boost::call_traits< T >::param_type data)
  {
    min = data;
    return *this;
  }

  MinMax2<T> operator,(typename boost::call_traits< T >::param_type data)
  {
    if (data < min)
    {
      max = min;
      min = data;
    }
    else
    {
      max = data;
    }
    return *this;
  }

public:
  T min;
  T max;
};

#define MINMAX(type, name) MinMax< type > name; name

int main()
{
  MINMAX(float, minmax) = 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0;
  printf("%f, %f\n", minmax.min, minmax.max);

  return 0;
}

gcc 4.3.0ではちゃんと定数展開されるのを確認した。