簡體   English   中英

具有靜態成員的C ++ / C#ABC設計模式

[英]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_namesschrodingers_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM