2整数の最大公約数を求めます。以下の条件を満たせば、必ずしも整数型でなくてもかまいません。
- 代入可能である
- <演算子が使用可能
- %演算子が使用可能
| 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | template<class T> T gcd(T m, T n) {   if (m < T(0) || n < T(0))   {     return T(-1);   }   T r;   while (T(0) < n)   {     r = m % n;     m = n;     n = r;   }   return m; } | 
以下は、再帰を利用したメタ関数版です。
| 0 1 2 3 4 5 6 7 8 9 10 11 12 | template<unsigned long M, unsigned long N> struct tgcd {   static const unsigned int value = tgcd<N, M % N>::value; }; template<unsigned long M> struct tgcd<M, 0UL> {   static const unsigned long value = M; }; | 
今回はせっかくなので、C++11向けのconstexpr版も作ってみましょう。なお、C++14以降であれば、最初に掲載したgcd関数にconstexprを付けるだけでOKです。
| 0 1 2 3 4 5 6 | template <class T> constexpr T gcd(T m, T n) {   return n == 0 ? m : gcd(n, m % n); } | 






