std :: array를 확장하는 generic 클래스 Vector와 벡터의 가능한 표현식을 정의하는 generic 클래스 Expression이 있습니다. C++에서 고유 연산자 **를 생성 하시겠습니까?
예 :
벡터 A ({1,2,3});
벡터 B ({2,2,2});
및 표현 :A + B;
A * B;
A-B;
A/B;
이제 두 개의 벡터 A와 B의 스칼라 생성 값으로 double을 반환하는 A ** B가 필요합니다. 결과는 2 + 4 + 6 = 12 여야합니다. 문제는 연산자 ** 구현입니다!
어떻게이 연산자를 쓸 수 있습니까 **?
내 아이디어에 대한 포인터를 반환 한 후 구조체-도난 데르 곱셈 연산자를 오버로드 벡터의 역 참조 연산자 *를 오버로드하는 것입니다 * ...이 오류가 해결되지 수 :
"아니오 적합한 변환 기능에서을 "표현 <은 ...>" "더블"
template<typename Left, typename Op, typename Right> class Expression {
const Left& m_left;
const Right& m_right;
public:
typedef typename Left::value_type value_type;
// Standard constructor
Expression(const Left& l, const Right& r) : m_left{ l }, m_right{ r } {}
size_t size() const {
return m_left.size();
}
value_type operator[](int i) const {
return Op::apply(m_left[i], m_right[i]);
}
};
struct Mul {
template<typename T> static T apply(T l, T r) {
return l * r;
}
};
template<typename Left, typename Right>
Expression<Left, Mul, Right> operator*(const Left& l, const Right& r) {
return Expression<Left, Mul, Right>(l, r);
}
.......................
// Class Vector extends std::array
template<class T, size_t S> class Vector : public array<T, S> {
public:
// Standard constructor
Vector<T, S>(array<T, S>&& a) : array<T, S>(a) {}
// Initializerlist constructor
Vector(const initializer_list<T>& data) {
size_t s = __min(data.size(), S);
auto it = data.begin();
for (size_t i = 0; i < s; i++)
this->at(i) = *it++;
}
};
.....................................
int main {
Vector<double, 5> A({ 2, 3, 4, 5, 6 });
Vector<double, 5> B({ 3, 3, 3, 3, 3 });
Vector<double, 5> C;
C = A * B; // is a Vector: [6, 9, 12, 15, 18] and it works.
double d = A**B; // but this one does not work, the error message is: "no suitable conversion function from "Expression<Vector<double, 5U>, Mul, Vector<double, 5U> *>" to "double" exists"
cout << d << endl; // must give me: 60
}
'dot (A, B)'와 같이하십시오. 어떤 잘못된 영혼이 스칼라 제품을'**'와 (과) 의미 하는가? !!! –
네, 네 말이 맞아! 하지만 이것은 학교의 숙제입니다. (그럴 필요가 있습니다!) – KIA
숙제이므로 반드시 질문에 직접 설명한대로 정확히 구현해야합니다. –