2

我有一个我想通用的 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++ 的模板魔法正好适合这里)?

只是为了后代,我想要这些静态的原因是因为我有大量的这些对象,并且正在编写效率至高无上的东西(想想大数据)。

非常感谢你的帮助。

4

1 回答 1

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++ 中,您通常必须编写一个函数来为您进行转换。

于 2013-08-06T22:09:28.620 回答