不同 c++ 类之间的运算符的简单实现
Simple implementation of operators between different c++ classes
有没有一种简单/聪明的方法来实现缺少的运算符:‘operator+’ (operand types are ‘myclassRef<int>’ and ‘myclass<int>’)
这两个类?我知道我可以定义一个将这两种类型作为参数的函数。但是由于我正在实现几个应该将myclass
和myclassRef
类型作为参数的函数,我想以简单的方式做到这一点。
我一直在考虑将myclassRef
作为myclass
的内部类并使用隐式转换,但是这种方法(据我所知)要求使用这两种类型作为参数的所有函数都成为成员函数。
#include <iostream>
using namespace std;
template <class T>
struct myclass;
template <class T>
struct myclassRef
{
T* i;
myclassRef(myclass<T>* A)
{
i = &A->i;
}
operator myclass<T>()
{
return myclass<T>(*i);
}
T& get()
{
return *i;
}
};
template <class T>
struct myclass
{
T i;
myclass() = default;
myclass(const myclass&) = default;
myclass(T _i) : i(_i) {}
myclassRef<T> ref()
{
return myclassRef<T>(this);
}
T& get()
{
return i;
}
T get() const
{
return i;
}
};
template <class T>
myclass<T>& operator+=(myclass<T>& lhs, const myclass<T>& rhs)
{
lhs.get() += rhs.get();
return lhs;
}
template <class T>
myclass<T> operator+(const myclass<T>& lhs, const myclass<T>& rhs)
{
myclass<T> res(lhs);
res += rhs;
return res;
}
int main() {
myclass<int> A(5);
myclass<int> B(2);
auto C = A + B;
std::cout << C.i << std::endl;
auto D = C.ref();
A = D + B;
return 0;
}
没有必要
使用内部类。相反,您应该构建两个全局运算符,它们存在于两个类之外,如下所示:
T operator+(const myclassRef<int>&, const myclass<int>&)
和过载
T operator+(const myclass<int>&, const myclassRef<int>&)
其中T
是您决定的返回类型。如果这些函数中的任何一个需要类中的私有数据,则通过将以下声明放在类声明中,使这些函数成为两个类的friend
:
friend T operator+(const myclassRef<int>&, const myclass<int>&);
friend T operator+(const myclass<int>&, const myclassRef<int>&);
继续前进,您可能希望在myclassRef
类型上制作这些函数模板,尽管只有更现代的编译器支持使模板函数成为朋友。
我使用template template
参数为我的问题提出了解决方案。这种方法允许我互换这两个类。但是,它需要对这两个类进行一些更改。对于myclassRef
,我必须添加get()
的const
版本,并将myclass
设置为friend class
。对于myclass
,我必须定义一个新的构造函数,即myclass(const myclassRef<T>& r)
.当然,还要更改两个运算符的参数。
更改在代码中标记。
#include <iostream>
using namespace std;
template <class T>
struct myclass;
template <class T>
struct myclassRef
{
T* i;
myclassRef(myclass<T>* A)
{
i = &A->i;
}
T& get()
{
return *i;
}
T get() const // Added as part of the answer
{
return *i;
}
friend class myclass<T>; // Added as part of the answer
};
template <class T>
struct myclass
{
T i;
myclass() = default;
myclass(const myclass&) = default;
myclass(T _i) : i(_i) {}
myclass(const myclassRef<T>& r) : i(*r.i) {} // Added as part of the answer
myclassRef<T> ref()
{
return myclassRef<T>(this);
}
T& get()
{
return i;
}
T get() const
{
return i;
}
};
template <template <class> class Mlhs, template <class> class Mrhs, class T> // Added as part of the answer
Mlhs<T>& operator+=(Mlhs<T>& lhs, const Mrhs<T>& rhs)
{
lhs.get() += rhs.get();
return lhs;
}
template <template <class> class Mlhs, template <class> class Mrhs, class T> // Added as part of the answer
myclass<T> operator+(const Mlhs<T>& lhs, const Mrhs<T>& rhs)
{
myclass<T> res(lhs);
res += rhs;
return res;
}
int main() {
myclass<int> A(5);
myclass<int> B(2);
auto C = A + B;
std::cout << C.i << std::endl;
auto D = C.ref();
A = D + B;
std::cout << A.i << std::endl;
return 0;
}
相关文章:
- 如何正确实现和访问运算符的各种自定义枚举器
- 三向比较运算符成员与非成员实现
- C++矩阵类运算符使用 std::common_type_t 和复数的实现
- 如何为我的类实现/重载二进制运算符
- 默认赋值运算符如何在实际 STL 中实现
- 使用'+='运算符统一实现 C++ '+'运算符
- 运算符+ 的规范实现涉及额外的移动构造函数
- 如何在层次结构中实现运算符使用?
- 如何在C++中实现切片运算符[]?
- C++ 20 中的运算符 == 和 <=> 应该作为成员还是自由函数实现?
- 将赋值运算符实现为"destroy + construct"是否合法?
- 为模板类中的>>运算符和<<运算符实现重载
- 使用括号运算符实现矩阵类的安全方法
- 分配运算符实现的说明
- 为什么 std::sort 不使用我的运算符<实现
- 复制构造函数和赋值运算符实现选项 -
- 如何在最大限度地提高大小有效性的同时,将3态的位运算符实现为任何大小的内存
- 将比较运算符"运算符<"实现为成员函数或外部函数
- 如何使用+=运算符实现标量和向量相加
- 为什么运算符>由 C++ STL 库中的运算符* 实现?