2017-12-17 21 views
-2

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 
} 
+0

'dot (A, B)'와 같이하십시오. 어떤 잘못된 영혼이 스칼라 제품을'**'와 (과) 의미 하는가? !!! –

+0

네, 네 말이 맞아! 하지만 이것은 학교의 숙제입니다. (그럴 필요가 있습니다!) – KIA

+0

숙제이므로 반드시 질문에 직접 설명한대로 정확히 구현해야합니다. –

답변

1

당신은 이런 식

#include <iostream> 
using namespace std; 

struct V 
{ 
    struct Vhelper 
    { 
    Vhelper(const V& v) : v(v) {} 
    const V& v; 
    }; 

    V operator*(const V&) const { 
    cout << "* called\n"; 
    return V(); 
    } 
    double operator*(const Vhelper&) const { 
    cout << "** called\n"; 
    return 42; 
    } 
    Vhelper operator*() { return Vhelper(*this); } 
}; 

int main() { 
    V a, b, c; 
    a = b * c; 
    double d = b ** c; 
    return 0; 
} 

을 할 수있는 "존재합니다하지만 당신은 possi 지금까지의 잊지한다 당신의 일이 채점 된 직후에 실제 코드에서는이 작업을 수행하지 마십시오.

이것은 실제 상황이 ** 인 모든 컨텍스트에서 사용할 수 없기 때문에 operator**은 본격적인 것이 아닙니다 (전원 작동에 사용하려는 경우 잘못된 우선 순위와 연관성이 있습니다). 그러나 약간 재미있는 학습 프로젝트에 대해서는 괜찮을 것입니다.

+0

실제 코드에서는 실제로 이것을하지 마십시오 .. – Rotem

+0

감사합니다 !! :)) – KIA