2

ジェネリックにしたいABCクラスがあります:

struct BinaryVariable {
  static const int N = 2;
  static std::string outcome_names[N] = { "heads", "tails" };
};

struct EvidenceBinaryVariable : public BinaryVariable {
  double likelihoods[ BinaryVariable::N ];
};

struct LatentBinaryVariable : public BinaryVariable { };

重要なことは、これら 3 つのノードのすべてのインスタンスが同じ を共有し、変数 ::Nに同じメモリを使用することです。outcome_names

これら 3 つのノード タイプを作成して、6 つの可能な結果を​​持つ変数も許可するとします (つまり、コインに加えてサイコロをサポートしたい)。C++ では、テンプレートを使用してこれを行うことができます。

#include<cstddef>
#include<string>

template<std::size_t N>
struct DiscreteVariable {
  static std::string outcome_names[N];
};

template<std::size_t N>
struct EvidenceVariable : public DiscreteVariable<N> {
  double likelihoods[ DiscreteVariable::N ];
};

template<std::size_t N>
struct LatentVariable : public DiscreteVariable<N> { };

int main()
{
    LatentVariable<2> schrodingers_coin;
    LatentVariable<6> schrodingers_die;
}

このようにテンプレートを使用しないと、3 つの型に静的outcome_namesメンバーを持たせる方法がわかりません (そして、同じ静的メモリ部分を参照しない場所shrodingers_coin.outcome_namesと場所)。schrodingers_dice.outcome_names

C# は型ベースのテンプレートのみをサポートします (つまり、提供することはできます<int>が、<6>.

最初の質問: C++ でこれに適した設計パターンはありますか? (たとえば、これらのトリプレットをマスター クラス内の内部クラスとして使用する必要がありますか?)

2 番目の質問: この優れたデザイン パターンは C# で機能しますか (または、C++ のテンプレート マジックはここに適していますか)。

後世のために、これらの静的オブジェクトが必要な理由は、これらのオブジェクトが大量にあり、効率が最優先されるもの (ビッグデータを考えてください) を書いているからです。

どうもありがとうございました。

4

1 に答える 1