modを常に保持するint

プログラミングコンテストでは、
「mod 100000007 で答えよ。」
みたいな問題がしばしば出題されますが、よくmod取るのを忘れるので、常にmodを保持するint型、modintを作ってみた。

template<int mod> class modint {
private:
  int _num;
  modint set(int num){ _num = num % mod; return *this; }
public:
  modint(){ _num = 0; }
  modint(int num){ _num = num % mod; }

  modint operator= (int x){ return set(x % mod); }
  modint operator+ (int x){ return modint<mod>(_num + (x % mod)); }
  modint operator- (int x){ return modint<mod>(_num - (x % mod)); }
  modint operator* (int x){ return modint<mod>(_num * (x % mod)); }
  modint operator+=(int x){ return set(_num + (x % mod)); }
  modint operator-=(int x){ return set(_num - (x % mod)); }
  modint operator*=(int x){ return set(_num * (x % mod)); }

  explicit operator int() { return _num; }
  friend ostream& operator<<(ostream &os, const modint<mod> &x){ os << x._num; return os; }
};

void run(void){

  /* entry point */
  modint<5> ans = 11;

  ans += 7;
  cout << ans << endl; // 3

}