ジェネリックにしたい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++ のテンプレート マジックはここに適していますか)。
後世のために、これらの静的オブジェクトが必要な理由は、これらのオブジェクトが大量にあり、効率が最優先されるもの (ビッグデータを考えてください) を書いているからです。
どうもありがとうございました。