[英]C++ / C# ABC design pattern with static member
我有一個想通用的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 ++的模板魔術在這里是否很合適)?
僅出於后代的原因,我想要這些靜態對象的原因是因為我擁有大量此類對象,並且正在編寫效率至高無上的東西(請考慮大數據)。
非常感謝你的幫助。
您的DiscreteVariable類只是一個枚舉,因此請使用一個枚舉。 這就是我在C#中實現的方式:
enum SchrodingersCoin
{
Heads,
Tails,
}
class Likelihood<T>
{
public static double[] likelihoods;
static Likelihood()
{
// Init likelihoods here using Enum.GetValues()
}
}
C ++實現:
enum SchrodingersCoin
{
Head,
Tails,
Count,
};
template <typename T>
struct Likelihood
{
static double likelihoods[T::Count];
};
在C#中,您可以輕松地將枚舉轉換為字符串,但是在C ++中,通常必須編寫一個函數來為您進行轉換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.