2009-06-14 6 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 2つのパラメータを取る(任意)関数へのポインタをすることができ、その場合に

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

は、なぜあなたはのtypedefを使用しなかったです:アンは、式を作成するには? –

+0

私はtypedefを使って、OPが式コンストラクタに渡す 'oper'型を定義しました。私は、それが2つのパラメータを取り、boolを返す関数へのポインタだと言っています。 – ChrisW

1

あなたが求めていることは完全にはわかりませんが、任意の文字列を演算子としてオーバーロードしようとしている場合は、できません。代わりに関数オブジェクトを作成し、OP(VAL1、VAL2)を返すようにOPERに)あなたが何をすべきhttp://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B

は、(過負荷演算子である:あなたがC++

にオーバーロードすることができ、オペレータの有限集合は、ここを参照してくださいあります。

2

類似の方法が、C++発現テンプレート技法で使用される。

式は、applyやevaluateなどのメソッドを使用してクラスとして作成します。このメソッドはパラメータを取り、式を適用します。

どのような表現テンプレートが使用されているかご覧ください。あなたのケースでは例として、 http://www.angelikalanger.com/Articles/Cuj/ExpressionTemplates/ExpressionTemplates.htm http://ubiety.uwaterloo.ca/~tveldhui/papers/Expression-Templates/exprtmpl.html

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; 
}; 

Th

#include <functional> 

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

tutorial