在模板 class 中创建重载友元运算符的模板

Create templates overloading friend operators in template class

我真的不知道如何正确创建它。我的模板 class 带有运算符重载。据我所知,我需要创建模板来重载此运算符以获得更通用的形式。我的问题是代码无法编译,我不知道如何修复它

示例:

    NSize<30> a(101);
    NSize<25> b(120);
    NSize<30> c(115);
    NSize<30> res = (a*b)*(a*c)*(c*b)*(b*a)*(a*c);

最终,我应该可以做到。现在我将其定义为:

template <int length>
friend NSize  operator * (const NSize &a, const NSize &b){
   //sth
}

我的 class 的定义如下所示:

template<int size,typename basic_type=unsigned int,typename long_type=unsigned long long,long_type base=256>
class NSize
{
   public:
   //sth
}

使 operator* 成为非模板,因为为什么它应该是模板。

否则每次调用 operator* 时都必须显式指定不可推导的模板参数 length,如下所示:

a.operator*<length>(b)

而不是

a * b

您可以通过以下方式实现您的 operator*

template<int size,typename basic_type=unsigned int,typename long_type=unsigned long long,long_type base=256>
class NSize
{
    // Note: that is not member but just friend
    template <int lengthA, int lengthB>
    friend NSize<lengthA + lengthB>  operator * (const NSize<lengthA> &a, const NSize<lengthB> &b);
};

// Actual definition that will work for every pair of Nsize of arbitrary size
template <int lengthA, int lengthB>
NSize<lengthA + lengthB>  operator * (const NSize<lengthA> &a, const NSize<lengthB> &b)
{
    return NSize<lengthA + lengthB>(...);
}

我们的想法是,我们应该定义 opeator * 可以采用任意大小的 2 Nsize 的方式。然后它生成结果,其大小是参数大小的总和(以确保结果始终适合)

但是使用这种方法这段代码

int main() {
    NSize<30> a(101);
    NSize<25> b(120);
    NSize<30> c(115);
    auto res = (a*b)*(a*c)*(c*b)*(b*a)*(a*c);
}

最终 res 大小为 285

Live example

如果你想坚持更大的参数大小,你可以用最大值替换总和:

constexpr int constmax(int a, int b) {
    return a>b?a:b;
}

//.....

friend NSize<constmax(lengthA,lengthB)>  operator * (const NSize<lengthA> &a, const NSize<lengthB> &b);

Live example