c++类设计:动态类型替代模板参数

C++ class design: dynamic typing alternative to template argument?

本文关键字:参数 类型 动态 c++      更新时间:2023-10-16

我想构建一个空间高效的模块化算术类。其思想是模数M是一个在实例化期间固定的不可变属性,因此如果我们有一个具有相同M的值的大数组(std::vector或其他容器),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

这是可行的,但是一个mod M值的大向量使用了所需空间的2倍。

我认为潜在的概念问题是不同模的Mod在语法上是相同类型的,即使它们"应该"是不同的类型。例如,像

这样的语句
m2 = m3;

应该"自然地"引发一个运行时错误(在我的版本中,它是"手动"引发的:check被内置到复制构造函数中,以及我实现的每个二进制操作符中)。

那么,有没有一种方法来实现某种动态类型,使Mod对象的类型记住模数?如果你能想出解决这个问题的办法,我将不胜感激。

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

编辑:据我所知,

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

  • 我想要的:由const对象参数化的类型(本例中为const num,组为const Group&const Group *const,等等)

这可能吗?

如果类需要知道M应该是什么而没有任何外部帮助,那么在零存储空间中很难做到这一点。最好的方法可能是存储一个指向共享M的指针,这取决于num的大小。但总不如免费好。

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

孤立地回答这个问题很难…了解更多的调用代码肯定会帮助你得到更好的答案。