2009-06-14 4 views
1

: 나는 연산자 클래스를 필요로하기 때문에"연산자"변수를 만드는 방법은 무엇입니까? (C++) 내가 표현 클래스를 만드는 작업입니다

template<typename T, typename U> 
class expression 
{ 
public: 
    expression(T vala, U valb, oper o){val1 = vala; val2 = valb; op = o;} 
    operator bool{return(val1 op val2);} 
private: 
    T val1; 
    U val2; 
    oper op; 
}; 

당신이 볼 수 있듯이,이 다소 의사입니다. 내 원래의 생각은 모든 가능한 연산자의 배열을 생성하고 문자열을 통해 변환하지만, 그것은 연산자의 단순한 숫자로 인해 작동하지 않을 것입니다 어떻게 2 차원 배열을 통해 이외의 문자열로 변환, 여기서 n [0] [0]은 첫 번째 연산자를 갖고 n [0] [1]은 해당 연산자 문자열을가집니다.

누구든지 표현식 클래스에 연산자 값을 추가 할 제안이 있습니까?

답변

2

아마도 포인터 일 수 있습니다. 대신 op ... 두 개의 파라미터를 취하는 (임의) 함수에 대한 포인터 일 수있는 경우에

operator bool{return(val1 op val2);} 

... 등 ... 코드를

operator bool{return op(val1, val2);} 

... 및 bool을 반환합니다.

template<typename T, typename U> 
class expression 
{ 
public: 
    //define pointer-to-function type 
    typedef bool *oper(const T& val1, const U& val2); 
    ... etc ... 
+0

가 왜 타입 정의를 사용 않은 것 : EN은 식을 만드는 방법? –

+0

typedef를 사용하여 OP가 expression 생성자에 전달하는 'oper'유형을 정의합니다. 두 매개 변수를 사용하고 bool을 반환하는 함수에 대한 포인터라고 말하고 있습니다. – ChrisW

1

나는 당신이 요구하는 것이 확실하지 않지만 임의의 문자열을 연산자로 오버로드하려고하면 할 수 없습니다. 당신이 C++

은 여기에서 볼에 오버로드 할 수있는 사업자의 유한 집합이 있습니다 : http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B

당신이해야 할 것은 오버로드 연산자() 연산을 함수 객체를 생성하고 반환하는 OPER에 (VAL1, val2만큼) 대신 .

2

유사한 방법이 C++ 표현 템플릿 기술에서 사용됩니다.

표현식을 적용 또는 평가와 같은 메소드로 클래스로 작성하십시오. 이 메서드는 매개 변수를 사용하고 식을 적용합니다.

사용중인 표현 템플릿을 확인하십시오.

struct isEqual 
{ 
    template <typename T, typename U> 
    bool operator()(T a, U b) 
    { 
     return a == b; 
    } 
}; 

template <typename T, typename OP> 
struct expression 
{ 
    T& a; 
    T& b; 
    OP& op; 

    expression(T a, T b, OP op) : a(a), b(b), op(op) {} 

    void eval() { op(a,b); } 
}; 


int main() 
{ 
    expression<int, isEqual> exp(1,2,isEqual()); 
    exp.eval(); 
} 
1

당신은 기능 표준 라이브러리를 사용하고로 인수를 취할 수 있습니다 :

std::tr1::function<bool (T,U)> 

예 :

#include <functional> 

template<typename T, typename U> 
class expression 
{ 
public: 
    expression(T vala, U valb, oper o) : val1(vala), val2(valb), op(o) 
    { } 
    operator bool{return op(val1, val2);} 
private: 
    T val1; 
    U val2; 
    std::tr1::function<bool (T,U)> op; 
}; 
귀하의 경우 예를 들어 http://www.angelikalanger.com/Articles/Cuj/ExpressionTemplates/ExpressionTemplates.htm http://ubiety.uwaterloo.ca/~tveldhui/papers/Expression-Templates/exprtmpl.html

Th

#include <functional> 

expression<int, int> foo(4,3, std::tr1::bind(greater())); 
다음

tutorial