gpt4 book ai didi

c# - 具有静态成员的 C++/C# ABC 设计模式

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:56:24 26 4
gpt4 key购买 nike

我有一个要通用的 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++ 中是否有好的设计模式? (例如,我应该将这些三元组用作大师类的内部类(class)吗?)

第二个问题:这种好的设计模式在 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++ 中,您通常必须编写一个函数来为您完成转换。

关于c# - 具有静态成员的 C++/C# ABC 设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18062680/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com