Как создать переменную “operator”?(C++)
-
13-09-2019 - |
Вопрос
Я работаю над созданием класса выражений:
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;
};
как вы можете видеть, это в некотором роде псевдокод, потому что мне нужен класс operator .Моей первоначальной мыслью было создать массив из всех возможных операторов, а затем преобразовать его через строку, но это не сработало бы из-за огромного количества операторов, и как преобразовать его в строку, кроме как через двумерный массив, где n[0][0] имеет первый оператор, а n[0] [1] имеет эту строку операторов.
Есть ли у кого-нибудь какие-либо предложения по добавлению значения оператора в мой класс expression?
Решение
Может быть, указатель на функцию.Вместо того , чтобы ...
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 ...
Другие советы
Аналогичные методы используются в c ++ expression templates techniqueue.
Вы создаете выражение как класс с помощью такого метода, как 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();
}
Я не совсем уверен, о чем вы спрашиваете, но если вы пытаетесь перегрузить произвольную строку в качестве оператора, вы не сможете.Существует конечный набор операторов, которые вы можете перегрузить в c ++
смотрите здесь: http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B
Что вам следует сделать, так это перегрузить operator() в oper для создания объекта function и вернуть вместо него op(val1, val2).
Вы можете использовать функциональную стандартную библиотеку и принять ваш аргумент как:
std::tr1::function<bool (T,U)>
ie:
#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()));
Вот такой Учебник