Могут ли операторы использоваться в качестве функций? (C ++) - PullRequest
3 голосов
/ 14 июня 2009

Это похоже на другой вопрос, который я задал, но я создал класс выражений, который работает следующим образом:

expression<int, int> exp(10, 11, GreaterThan);
//expression<typename T, typename U> exp(T val1, U val2, oper op);
//where oper is a pointer to bool function(T, U)

где GreaterThan - ранее определенная функция. И мне интересно, почему я не могу сделать это:

expression<int, int> exp(10, 11, >);

особенно когда> перегружен как

bool operator>(int a, int a){return (a > b);}

, что идентично GreaterThan:

bool GreaterThan(int a, int b){return (a > b);}

Функция, которая возвращает bool и принимает два аргумента.

Ответы [ 5 ]

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

Я не уверен, что это то, о чем вы спрашиваете, но стандартная библиотека C ++ предоставляет функциональные объекты для многих операторов C ++, объявленных в заголовке <functional>. Это включает std::plus (+), std::minus (-), std::multiplies (*), std::divides (/), std::modulus (%), std::negate (унарный -), std::equal_to (= =), std::not_equal_to (! =), std::less (<), <code>std::greater (>), std::less_equal (<=), <code>std::greater_equal (> =), std::logical_and (&&), std::logical_or (||), std::logical_not (!)

Так что, может быть, вы просто хотите

expression<int, int> exp(10, 11, std::greater<int>());
6 голосов
/ 14 июня 2009

Вместо:

expression<int, int> exp(10, 11, >);

Вы могли бы сделать это:

expression<int, int> exp(10, 11, operator>);

Вы могли бы , потому что это не работает для целых чисел. Но это будет работать для других типов или операторов, которые вы будете перегружать.

Операторы, которые вы перегружаете, являются обычными функциями, поэтому на самом деле вы играете с указателями функций.

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

Вы не могли написать следующее:

bool operator>(int a, int a){return (a > b);}

C ++ не допускает перегрузки операторов для встроенных типов. Пожалуйста, перепишите свой вопрос и, в частности, укажите действительный код для шаблона выражения.

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

Нил прав, это не сработает для встроенных типов. По крайней мере, один из параметров должен быть «формальным типом класса». Другая проблема заключается в том, что

expression<int, int> exp(10, 11, >);

это не то, что вам нравится писать компилятору. Вместо этого вы можете использовать что-то вроде следующего кода

class A
{

};
class B
{

};
typedef bool (*oper)(A& a, B& b);
bool operator>(A& a, B& b)
{
  return false;

}
bool func(A&a, B& b, oper op)
{

}

и затем в вашем коде

  A a;
  B b;
  func(a, b, operator>);
0 голосов
/ 21 сентября 2009

Например, оператор + имеет тип

int (__thiscall Integer::*)(int value)

для операторской функции

int Integer::operator + (int i)

Чтобы передать функцию оператора, вы просто делаете это:

Integer a(10), b(20);
add(a, b, &Integer::operator +);

Чтобы использовать это, сделайте это:

(a.*functionPtr)(b);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...