gpt4 book ai didi

C++类设计: dynamic typing alternative to template argument?

转载 作者:太空狗 更新时间:2023-10-29 23:03:51 25 4
gpt4 key购买 nike

我想构建一个节省空间的模块化算术类。这个想法是模数 M 是一个不可变的属性,在实例化期间得到固定,所以如果我们有一个大数组(std::vector 或另一个容器)的值具有相同的 M,M 只需要存储一次。

如果 M 可以在编译时固定,这可以使用模板来完成:

template <typename num, num M> class Mod_template
{
private:
num V;
public:
Mod_template(num v=0)
{
if (M == 0)
V = v;
else
{
V = v % M;
if (V < 0)
V += M;
}
}
// ...
};

Mod_template<int, 5> m1(2); // 2 mod 5

不过,在我的应用中,我们应该可以表达M运行时。我所看到的是这样的:

template <typename num> class Mod
{
private:
const num M;
num V;
public:
Mod(num m, num v=0): M(abs(m))
{
if (M == 0)
V = v;
else
{
V = v % M;
if (V < 0)
V += M;
}
}
// ...
};

Mod<int> m2(5, 2); // 2 mod 5
Mod<int> m3(3); // 0 mod 3

这行得通,但是模 M 值的大 vector 使用了它所需空间的 2 倍。

我认为潜在的概念问题是不同模数的 Mod 在句法上属于同一类型,即使它们“应该”是不同的类型。例如,这样的语句

m2 = m3;

应该“自然”引发运行时错误(在我的版本中,它是“手动”引发的:检查内置于复制构造函数以及我实现的每个二元运算符中)。

那么,有没有办法实现某种动态类型,以便 Mod 对象的类型记住模数?如果能知道如何解决这个问题,我将不胜感激。

这对我来说是一个反复出现的问题,涉及各种数学结构(例如,在同一集合上存储许多排列,同一组的元素等)

编辑:据我所知,

  • 模板是由类或文字参数化的类型。

  • 我想要的:由 const 对象参数化的类型(const num 在这种情况下,const Group&const Group *const 用于组等)。

这可能吗?

最佳答案

如果类(class)需要知道什么,在零存储空间中将很难做到M应该没有任何外界帮助。可能您能做的最好的事情就是存储一个指向共享 M 的指针。 ,这可能会好一点,具体取决于 num 的大小。是。但它不如免费。

如果M会更容易设计是所有需要它的函数的传入值。然后你可以做一些事情,比如创建一个共享相同 M 的对象池。 (有很多简单的方法可以设计这个;例如 map<num, vector<num> > )并且只存储 M一次去游泳池。调用者需要知道哪个池 Mod对象来自,但这可能是它知道的事情。

很难单独完美地回答这个问题……了解更多关于调用代码的信息肯定会帮助您获得更好的答案。

关于C++类设计: dynamic typing alternative to template argument?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24371211/

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