3

スペース効率の良いモジュラー算術クラスを構築したいと考えています。モジュラス 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グループなど)。

これは可能ですか?

4

1 に答える 1

1

Mクラスが外部の助けなしに何をすべきかを知る必要がある場合、ゼロのストレージスペースでそれを行うことは困難です. あなたができる最善の方法は、 shared へのポインタを保存することMですnum。しかし、それは無料ほど良くありません。

Mが必要なすべての関数に渡される値である場合、設計が容易になります。次に、すべてが同じものを共有するオブジェクトのプールを作成しM(これを設計するための簡単な方法はたくさんあります。たとえば) 、プールに対して 1 回map<num, vector<num> >だけ保存するなどのことができます。M呼び出し元は、Modオブジェクトがどのプールから来たかを知る必要がありますが、それはおそらく知っていることです。

この質問に単独で完全に答えるのは難しいです...呼び出しコードについてもっと知ることは、より良い答えを得るのに間違いなく役立ちます.

于 2014-06-23T17:30:01.810 に答える