2013-08-05 21 views
2

我有一個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_namesschrodingers_dice.outcome_names不是指相同的靜態一塊內存),而不用這種方式使用模板。

C#僅支持基於類型的模板(即你能提供<int>但不<6>

第一個問題:有沒有在C++中(例如,我應該用這些三胞胎的內內部類的一個很好的設計模式?大師班)

第二個問題:?這是否好的設計模式工作在C#(或者是C++的模板魔術只是一個不錯的選擇在這裏)

只是爲了子孫後代,我想這些靜態的原因是因爲我有大量的這些對象,並且正在寫效率的東西(最重要的數據)。

非常感謝您的幫助。

+0

OP:我編輯了你的C++代碼,至少使它成爲有效的代碼。 –

+0

很少有問題。首先,應該''LatentVariable <2> foo;'和'LatentVariable <2> bar;'指向相同的'DiscreteVariable'字符串數組?如果不是,那麼你不希望'outcome_names []'是靜態的。其次,這是一個構成比繼承更有意義的例子; 'DiscreteVariable'或者說'outcome_names []'應該是'LatentVariable'的一個成員(可能是非靜止的,取決於第一個問題的答案)。 – Suedocode

+0

爲什麼不使用枚舉? –

回答

0

您的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++中,你通常需要編寫一個函數來完成轉換爲你。