1

私は式クラスの作成に取り組んでいます:

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] にはその演算子文字列があります。

私の式クラスに演算子の値を追加するための提案はありますか?

4

4 に答える 4

2

多分関数ポインタ。それ以外の ...

operator bool{return(val1 op val2);}

... 次のようにコーディングします ...

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

...この場合op、2 つのパラメーターを取り、bool を返す (任意の) 関数へのポインターにすることができます。

template<typename T, typename U>
class expression
{
public:
    //define pointer-to-function type
    typedef bool *oper(const T& val1, const U& val2);
    ... etc ...
于 2009-06-14T03:03:54.160 に答える
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;
};

次に、式を作成するには:

#include <functional>

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

ここにチュートリアルがあります

于 2009-06-14T04:56:07.637 に答える
1

あなたが何を求めているのか完全にはわかりませんが、任意の文字列を演算子としてオーバーロードしようとしている場合はできません。C++ でオーバーロードできる限定された演算子のセットがあります。

ここを参照してください: http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B

すべきことは、oper で operator() をオーバーロードして関数オブジェクトを作成し、代わりに op(val1, val2) を返すことです。

于 2009-06-14T03:03:16.657 に答える