スペース効率の良いモジュラー算術クラスを構築したいと考えています。モジュラス M は、インスタンス化中に修正される不変の属性であるため、同じ M を持つ値の大きな配列 (std::vector または別のコンテナー) がある場合、M は一度だけ格納する必要があるという考えです。
コンパイル時に M を修正できる場合は、テンプレートを使用して修正できます。
template <typename num, num M> class Mod_template
{
private:
num V;
public:
Mod_template(num v=0)
{
if (M == 0)
V = v;
else
{
V = v % M;
if (V < 0)
V += M;
}
}
// ...
};
Mod_template<int, 5> m1(2); // 2 mod 5
ただし、私のアプリケーションでは、M ランタイムを表現できるはずです。私が持っているものは次のようになります:
template <typename num> class Mod
{
private:
const num M;
num V;
public:
Mod(num m, num v=0): M(abs(m))
{
if (M == 0)
V = v;
else
{
V = v % M;
if (V < 0)
V += M;
}
}
// ...
};
Mod<int> m2(5, 2); // 2 mod 5
Mod<int> m3(3); // 0 mod 3
これは機能しますが、mod M 値の大きなベクトルは、必要なスペースの 2 倍を使用します。
根底にある概念上の問題は、異なるモジュライの Mod は、異なるタイプである必要があるにもかかわらず、構文的には同じタイプであるということだと思います。たとえば、次のようなステートメント
m2 = m3;
「自然に」実行時エラーを発生させる必要があります(私のバージョンでは、「手動で」発生します。チェックは、実装するすべてのバイナリ演算子と同様に、コピーコンストラクターに組み込まれています)。
では、Mod オブジェクトの型がモジュラスを記憶するように、ある種の動的型付けを実装する方法はありますか? これを解決する方法を教えていただければ幸いです。
これは、さまざまな数学的構造 (たとえば、同じセットに多くの順列を格納する、同じグループの要素など) で繰り返し発生する問題です。
編集:私が理解する限り、
テンプレートは、クラスまたはリテラルによってパラメーター化された型です。
私が欲しいもの: const オブジェクトによってパラメータ化された型(
const num
この場合、const Group&
またはconst Group *const
グループなど)。
これは可能ですか?