在模板 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
如果你想坚持更大的参数大小,你可以用最大值替换总和:
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);
我真的不知道如何正确创建它。我的模板 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
如果你想坚持更大的参数大小,你可以用最大值替换总和:
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);