メタ関数の再帰停止の方法についての質問です.
メタ関数の再帰停止の方法についての質問です.
最大公倍数を求めるメタ関数を作ろうとして引数をintに固定したものはすぐ作れたのですが
引数を任意の整数にしたものを作ろうとしたところ,いろいろな方法を試みましたがどれもだめで結局以下のようにしました.
template<typename IntegerT, IntegerT Rhs, IntegerT Lhs>
struct gcd;
template<int Rhs, int Lhs>
struct gcd<int, Rhs, Lhs>
{
typedef int integer_type;
typedef gcd<integer_type, Rhs, Lhs> type;
typedef integer_type value_type;
static const value_type value =
gcd<integer_type, Lhs, Rhs % Lhs>::type::value;
};
template<int Rhs>
struct gcd<int, Rhs, 0>
{
typedef int integer_type;
typedef gcd<integer_type, Rhs, 0> type;
typedef integer_type value_type;
static const value_type value = Rhs > 0 ? Rhs : -Rhs;
};
template<long long Rhs, long long Lhs>
struct gcd<long long, Rhs, Lhs>
{
typedef long long integer_type;
typedef gcd<integer_type, Rhs, Lhs> type;
typedef integer_type value_type;
static const value_type value =
gcd<integer_type, Lhs, Rhs % Lhs>::type::value;
};
template<long long Rhs>
struct gcd<long long, Rhs, 0ll>
{
typedef long long integer_type;
typedef gcd<integer_type, Rhs, 0ll> type;
typedef integer_type value_type;
static const value_type value = Rhs > 0ll ? Rhs : -Rhs;
};
しかし,この方法だと考えられる整数全てに対して特殊化を定義せねばならず何のためにテンプレートを使っているのかわかりません.
テンプレートのインスタンス化の順序を考えてみるとコンパイル時に再帰を停止するための条件が普通に考えたものとは異なるように思うのですが,どのようにすればもっと簡単に一般の整数型(short,long等)に対してメタ関数を定義できるでしょうか?
お礼
どうもありがとうございます. わたくしのくだらない勘違いにお付き合い させたようでもうしわけありません. 私はこのようなおかしな間違いをよくするので 今後もよろしくお願いします.
補足
なるほど,やっと皆さんのおっしゃっていることがわかりました. 確かにlongは32ビットでintと同じでした. てっきり64ビットと思い込んでいました. みなさんどうもありがとうございました.