Как сделать переменную "оператор"? (C ++) - PullRequest
1 голос
/ 14 июня 2009

Я работаю над созданием класса выражений:

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

Как видите, это несколько псевдокод, потому что мне нужен класс операторов. Моя первоначальная мысль состояла в том, чтобы создать массив всех возможных операторов, а затем преобразовать его через строку, но это не сработало бы из-за огромного количества операторов и способа преобразования его в строку, кроме как через двумерный массив, где n [0] [0] имеет первый оператор, а n [0] [1] имеет строку этих операторов.

У кого-нибудь есть предложения по добавлению значения оператора в мой класс выражений?

Ответы [ 4 ]

2 голосов
/ 14 июня 2009

Возможно указатель на функцию. Вместо ...

operator bool{return(val1 op val2);}

... закодируйте его как ...

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

... в этом случае op может быть указателем на (любую) функцию, которая принимает два параметра и возвращает bool.

template<typename T, typename U>
class expression
{
public:
    //define pointer-to-function type
    typedef bool *oper(const T& val1, const U& val2);
    ... etc ...
2 голосов
/ 14 июня 2009

Подобные методы используются в технике шаблонов выражений c ++.

Вы создаете выражение как класс с помощью метода, такого как apply или figure. Этот метод принимает параметры и применяет выражение.

Посмотрите, что используют шаблоны выражений. 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 голос
/ 14 июня 2009

Вы можете использовать функциональную стандартную библиотеку и принять ваш аргумент как:

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()));

Вот учебник

1 голос
/ 14 июня 2009

Я не совсем уверен, что вы спрашиваете, но если вы пытаетесь перегрузить произвольную строку как оператор, вы не можете. Существует конечный набор операторов, которые вы можете перегрузить в c ++

см. Здесь: http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B

Что вам нужно сделать, так это перегрузить operator () в oper, чтобы создать объект функции и вместо этого вернуть op (val1, val2).

...