模板类实例接收不同类型的相同模板类的另一个实例
template class instance receiving another instance of the same template class of different type
模板类实例如何接收不同类型的相同模板类的另一个实例作为其某些函数成员的参数?(我很难用更简单的方式表达我的问题,对此我感到非常抱歉。
这是一个工作代码。我创建了一个类,并将其命名为 MyClass。它在其运算符=和运算符+成员函数上接受相同类型(为int)的相同模板类。
#include <iostream>
using namespace std;
template<class T>
class MyClass {
protected:
T __val;
public:
MyClass();
MyClass(T val): __val(val) {}
void operator= (const MyClass<T>& r)
{
__val = (T)r.__val;
}
const MyClass<T>& operator+ (const MyClass<T>& r)
{
return *(new MyClass<T>(__val + (T)r.__val));
}
T retval() {return __val;}
};
int main()
{
MyClass<int> myclass1(1);
MyClass<int> myclass2(2);
MyClass<int> myclass3 = myclass1 + myclass2;
cout << myclass3.retval() << endl;
return 0;
}
出于以下目的,我__val运算符=和运算符+的参数成员进行了类型转换:
int main()
{
MyClass<int> myclass1(1);
MyClass<double> myclass2(2.5);
MyClass<int> myclass3 = myclass1 + myclass2;
cout << myclass3.retval() << endl;
return 0;
}
显然我会得到一个错误。我不能仅仅MyClass<int>::operator+
因为 myclass2 想要MyClass<int>
参数而不是MyClass<double>
而将 myclass2 作为参数传递给 myclass1 的运算符 + 。我知道我可以重载另一个接受MyClass<double>
运算符+,但我也想用其他数字类型(如浮点数、单数等)来重载。为所有这些函数制作重载函数会使我的代码更大,这显然不希望发生。
我必须从 MyClass 更改什么才能使我的第二个主函数正常工作?
您需要一个模板成员operator+
。此外,它应该返回一个值,而不是一个引用:
template<class T>
class MyClass
{
public:
template <typename T2>
MyClass operator+ (const MyClass<T2>& r) const { return _val + r.retval(); }
T retval() const {return _val;}
// as before
};
请注意,这将在涉及 operator+
的表达式中返回与 LHS 类型相同的值。请注意,最好将operator+
实现为非成员二进制运算符。但是你必须实现一些编译时逻辑来确定返回类型:
template <typename T1, typename T2>
MyClass< ?? > operator+(const MyClass<T1>& lhs, const MyClass<T1>& rhs)
{
return lhs.retval() + rhs.retval();
}
其中??
应替换为编译构造,以根据T1
和T2
选择类型。据推测,这将是这两种类型之一。这是一个 C++11 示例:
template <typename T1, typename T2>
auto operator+(const MyClass<T1>& lhs, const MyClass<T1>& rhs)->decltype(lhs.retval()+rhs.retval())
{
return lhs.retval() + rhs.retval();
}
这样做的好处是,返回类型是独立于 LHS 或 RHS 上的内容确定的。
这样写:
template<typename _Ty> MyClass<T> operator+ (const MyClass<_Ty>& r) {
return MyClass<T>(__val + (static_cast<_Ty> (r.__val)) );
}
以提供成员函数。但要更普遍地支持它,请像:
template<typename _T,typename _Ty> MyClass<_T> operator+ (const Myclass<_T>& p,const MyClass<_Ty>& r) {
return MyClass<T>(p.__val + (static_cast<_T> (r.__val)) );
}
不幸的是,为此您必须将__val
清除为公共
强制转换比点具有更强的优先级,即代替
(T)r.__val
你必须写
(T) (r.__val)
更好的是,使用static_cast
.因此,定义operator +
类似
template<class S>
MyClass<T> operator+ (const MyClass<S>& r) {
return MyClass<T>(__val + (static_cast<S> (r.__val)) );
}
或者根本不使用显式强制转换:
template<class S>
MyClass<T> operator+ (const MyClass<S>& r) {
return MyClass<T>(__val + r.__val);
}
最好让 retval 返回一个 const T &,在运算符 + 的实现中使用 retval (),并使运算符 + 成为非成员非友元:
template<class T>
class MyClass {
private:
T m_val;
public:
MyClass(T val): m_val(val) {}
const T & retval () const {return m_val;}
};
template<class T1, class T2>
auto operator+ (const MyClass<T1>& r1, const MyClass<T2> & r2)
-> MyClass < std::remove_const < std::remove_reference <
decltype ( r1.retval () + r2.retval () )
> > > {
return r1.retval () + r2.retval ();
}
- 如何将模板的实例传递给另一个模板的另一个实例?
- 如何在另一个类中创建类的实例?
- 如果模板参数是另一个模板的实例化,则键入特征测试
- 重载运算符*以获取对另一个类的实例的引用
- 我有一个类,它创建了另一个类的实例.如何将变量通过第一个类传递到第二个类的实例化中?
- 如何正确实例化静态字段 tat 是另一个类对象
- C++ - 使用另一个类的构造函数实例化一个对象
- 如何使用另一个模板化类的实例模板化类?
- 在另一个类中创建类实例时出现问题
- C++:递归地将字符串中一个字母的所有实例替换为另一个字母
- 另一个类中嵌套模板的外部实例化
- 如何为包含另一个类实例的数组制作常量 getter?
- 如何将模板化类实例作为模板参数传递给另一个模板?
- 如何在 C 中包装C++具有参数的类方法或返回另一个C++类的实例?
- 如何将对象函数的实例传递给另一个函数
- "new operator"将另一个类实例化为工厂?
- 如何在C++中将类的实例完全重新分配给同一类的另一个实例(然后删除原始对象)?
- 如何使用 c++ 从另一个 cpp 文件中的 main.cpp 调用实例化类
- 无法从派生类型的作用域访问另一个实例的受保护成员
- 类实例的C++/向量作为另一个类的属性