gpt4 book ai didi

c++ - 同一模板的不同类类型相互交互

转载 作者:行者123 更新时间:2023-11-30 04:24:17 26 4
gpt4 key购买 nike

我想知道以下是否可行。假设我有这样的代码:

template <class NumberType>
struct Number
{
NumberType value;

void operator = (Number in_val)
{
value = in_val;
}
}

然后我就可以做类似的事情了:

Number<int> n1, n2;
n2.value = 5;
n1 = n2;
cout << "Value: " << n1.value << endl;

但这不允许我执行以下操作:

Number<int> n1;
Number<double> n2;
n2.value = 5;
n1 = n2;
cout << "Value: " << n1.value << endl;

如何做到这一点?我是否必须用另一个结构/类包装这个结构/类,或者我是否必须进行一些奇特的递归?

附注我已经使用 C++ 一段时间了,但从未尝试过 templates。所以考虑到我对模板非常陌生。

-- 编辑--好的,我现在明白了。但是另一个相关的问题来了。

template<class OtherNumType>
Number& operator *= ( const OtherNumType& in_value)
{
value *= in_value;
return *this;
}

这给出了一个编译错误。为什么?正确的做法是什么?

最佳答案

当模板定义Number<T>编译器考虑任何特定类型 T , 名字 Number (当用作类型名称时)被解释为 Number<T> ,随便T可能就在那个时候。

因此,对于 Number<int> ,您当前的模板定义仅提供以下赋值运算符:

void operator=(Number<int> in_val)

因为Number被解释为 Number<int>那时。

为了使运算符更加灵活,可以将其变成成员模板(已经模板化的类中的模板化函数):

template <class NumberType>
struct Number
{
NumberType value;

template <typename T2>
Number &operator=(const Number<T2> &in_val)
{
value = in_val.value;
return *this;
}
};

注意我是如何修改运算符的,不仅接受 Number<T2>对于任何类型 T2 , 也让它返回 *this并将参数作为常量引用接受——这是定义赋值运算符最常见和最有用的方法。

关于c++ - 同一模板的不同类类型相互交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12872227/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com