gpt4 book ai didi

c++ - 在派生类中重定义基类的友元函数

转载 作者:行者123 更新时间:2023-11-28 07:11:53 25 4
gpt4 key购买 nike

我想重新定义Vector类中原本定义为友元的operator*函数,在派生类中,BigNum .具体来说,我想调用 operator*Vector 版本,然后在 BigNum 的 operator* 中对该操作的结果做一些其他事情.这是该结构的一个片段(再次感谢@lemmes 提供的帮助):

template<typename T>
class Vector
{
private:
std::vector<T> base;

public:
Vector();
Vector(const std::vector<T> vec);
Vector(const Vector& vec);

template<typename T1, typename T2>
friend auto operator*(const Vector<T1>& lhs, const Vector<T2>& rhs) -> Vector<decltype(std::declval<T1>() * std::declval<T2>())>;
};

template<typename T1, typename T2>
auto operator*(const Vector<T1>& lhs, const Vector<T2>& rhs) -> Vector<decltype(std::declval<T1>() * std::declval<T2>())>
{
typedef decltype(std::declval<T1>() * std::declval<T2>()) T3;
assert(lhs.base.size() == rhs.base.size());
Vector<T3> result;
result.base.reserve(lhs.base.size());
std::transform(lhs.base.begin(), lhs.base.end(), rhs.base.begin(), std::back_inserter(result.base),
[](const T1& e1, const T2& e2) { return e1 * e2; });
return result;
}

class BigNum : public Vector<int>
{
public:
BigNum();
BigNum(const std::vector<int> init);
~BigNum();

BigNum operator*(const BigNum& rhs);
};
#endif

BigNum BigNum::operator*(const BigNum& rhs)
{

// How can I call Vector's operator* (a friend of the Vector class)
// and then do other stuff in here?
}

#include "BigNum.h"

int main()
{

int arr1[] = {1,2,3,4,5};
int arr2[] = {10,20,30,40,50};
std::vector<int> vec1 (arr1, arr1 + sizeof(arr1) / sizeof(arr1[0]));
std::vector<int> vec2 (arr2, arr2 + sizeof(arr2) / sizeof(arr2[0]));

BigNum bn1(vec1), bn2(vec2);

bn1 * bn2; // want to call BigNum's operator* here

return 0;
}

我显然不能做像 Vector::operator* 这样的事情,因为它是 friend 。提前致谢!

最佳答案

你可以写static_cast<Vector<int>&>(bn1) * static_cast<Vector<int>&>(bn2)调用 vector 的重载运算符。

关于c++ - 在派生类中重定义基类的友元函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20847051/

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