c++类设计:动态类型替代模板参数
C++ class design: dynamic typing alternative to template argument?
我想构建一个空间高效的模块化算术类。其思想是模数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
对象来自哪个池,但这可能是它知道的。
孤立地回答这个问题很难…了解更多的调用代码肯定会帮助你得到更好的答案。
相关文章:
- 扩展C++生成的代码的模板参数类型名称
- 如何在 c++ 中定义接受不同参数类型的函数向量?
- 在 C++ 中运行时调用模板时,是否可以切换模板的参数类型?
- 将函数参数类型声明为 auto
- 将函数的参数 - 签名从使用 'std::function<T>' 转换为模板参数类型
- 在 C++17 中调用具有不同参数类型的构造函数
- 具有先前参数类型匹配的参数包
- 我想知道为什么"std::unique_ptr<int> foo(新 int)"是合法的,因为"std::<int>unique_ptr"要求输入参数类型应该是"int"?
- 将可变参数类型列表的扩展打包为复杂类型的初始值设定项列表 - 合法吗?
- MSVC 错误:4 个重载中的任何一个都无法转换所有参数类型
- 使用constexpr + auto作为返回和参数类型的奇怪类型推导
- 如何从第一个参数推断第二个参数类型?
- C++模板函数中,指定回调函子/lambda 的参数类型,同时仍允许内联?
- 如何用不同的参数类型和数字回调函数
- C++stoi:这两个重载都无法转换所有参数类型
- 为什么std::{container}::template不能推导其参数类型
- 为模板参数类型中的新对象分配内存
- 为指向成员模板参数的指针推导额外模板参数类型的紧凑方式
- 使用std::conditional中的模板来确定函数参数类型
- C++中的短参数类型