我有一個ABC類我要讓通用:C++/C#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 { };
重要的是,這三個節點共享同::N
的每個實例,並使用相同的內存爲outcome_names
變量。
比方說,我想使這三個節點類型也允許有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;
}
我不能想出一個辦法來獲得三種類型有一個靜態outcome_names
成員(並在shrodingers_coin.outcome_names
和schrodingers_dice.outcome_names
不是指相同的靜態一塊內存),而不用這種方式使用模板。
C#僅支持基於類型的模板(即你能提供<int>
但不<6>
第一個問題:有沒有在C++中(例如,我應該用這些三胞胎的內內部類的一個很好的設計模式?大師班)
第二個問題:?這是否好的設計模式工作在C#(或者是C++的模板魔術只是一個不錯的選擇在這裏)
只是爲了子孫後代,我想這些靜態的原因是因爲我有大量的這些對象,並且正在寫效率的東西(最重要的數據)。
非常感謝您的幫助。
OP:我編輯了你的C++代碼,至少使它成爲有效的代碼。 –
很少有問題。首先,應該''LatentVariable <2> foo;'和'LatentVariable <2> bar;'指向相同的'DiscreteVariable'字符串數組?如果不是,那麼你不希望'outcome_names []'是靜態的。其次,這是一個構成比繼承更有意義的例子; 'DiscreteVariable'或者說'outcome_names []'應該是'LatentVariable'的一個成員(可能是非靜止的,取決於第一個問題的答案)。 – Suedocode
爲什麼不使用枚舉? –