我有一个我想通用的 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++ 的模板魔法正好适合这里)?
只是为了后代,我想要这些静态的原因是因为我有大量的这些对象,并且正在编写效率至高无上的东西(想想大数据)。
非常感谢你的帮助。