这篇帖子翻译自 这篇博文。
转到 C♯ 上写密码学代码,C♯ 泛型比 C++ 模板的限制多很多,比如 对于泛型参数,不能使用(算术)运算符。这导致类似
template <unsigned p>
struct Z
{
// Z/pZ 这个环的实现。
};
template <typename TRing>
struct Foo
{
/* TRing 是一个环的类型,可以当成黑箱
*/
struct AffineTransform
{
TRing k, b;
TRing operator () (TRing x) const
{
return k * x + b;
}
};
static std::function<TRing(TRing)>
CreateAffineTransform(TRing k, TRing b)
{
AffineTransform aff;
aff.k = k;
aff.b = b;
return aff;
}
};
在 C♯ 里不可行。解决方法是 用 CRTP,让类型自带接口,替代运算符。
另一个问题:C♯ 里面的泛型参数只能是类型,不能是值,这样 Z<p>
的实现看起来就要分开写好几次。
有两个丑的绕过方法:
第一个方法和 C♯ 本身没有关系了,而且回到原始人时代;第二个方法除了降低运行时效率之外,还会一下子把一个环元素的大小 扩大一倍!
答案是把数值 放进一个类型里面,再借助 CRTP 书写辅助工具,可以让这个基础设施非常好用。
具体请移步 原文
1
gnaggnoyil 2017-08-04 01:55:58 +08:00
|
2
geelaw OP |
3
lindexi 2017-08-04 20:34:43 +08:00
泛型很厉害,至少可以不写工厂
|