Можно ли получить указатель на функцию встроенного стандартного оператора?

Я хочу обратиться к указателям на функции встроенных операторов, но я не знаю, как указать конкретные типы перегрузок.

У меня есть следующая подпись classа шаблона:

template class MyAction { public: MyAction(ParamsType& arg0, ParamsType& arg1, FnCompareType& fnCpmpare) : arg0_(arg0), arg1_(arg1), fnCompare_(fnCpmpare) {} bool operator()() { if((*fnCompare_)(arg0_,arg1_) { // do this } else { // do s.th. else } } private: ParamsType& arg0_; ParamsType& arg1_; FnCompareType& fnCompare_; } 

И хотите использовать синтаксис следующим образом:

 void doConditional(int param1, int param2) { MyAction=> action(param1,param2); if(action()) { // Do this } else { // Do that } } 

Но это не компилируется:

 error: '::operator>=' has not been declared 

Что я могу сделать, чтобы ссылаться на такие встроенные статические операции?

Встроенные операторы

Почему у вас нет указателей на функции:

C ++ 11, §13.6 / 1, [over.built]

Функции оператора-кандидата, представляющие встроенные операторы, определенные в разделе 5, указаны в этом подпункте. Эти кандидатские функции участвуют в процессе разрешения перегрузки оператора, как описано в 13.3.1.2, и используются для других целей .

Встроенные операторы (для встроенных типов) не являются реальными функциями оператора . Поэтому у вас не может быть указателя на функцию, указывающего на них. Вы также не можете вызывать их с помощью синтаксиса operator<(A,B) . Они участвуют только в разрешении перегрузки, но компилятор переводит их непосредственно в соответствующую инструкцию asm / machine без какого-либо «вызова функции».

Способ обойти эту проблему:

user1034749 уже ответил на этот вопрос, но для полноты:

Стандарт определяет множество функциональных объектов в §20.8, [function.objects] , т.е.

  • Арифметические операции
  • Сравнения
  • Логические операции
  • Побитовые операции

Функциональный объект является объектом типа объекта функции. В тех местах, где можно было бы ожидать перехода указателя на функцию к алгоритмическому шаблону (раздел 25), интерфейс указан для принятия объекта функции. Это не только позволяет алгоритмическим шаблонам работать с указателями на функции, но также позволяет им работать с произвольными объектами функции.

C ++ 11, §20.8.5, [сравнения]

  • равно
  • not_equal_to
  • больше, меньше
  • greater_equal
  • less_equal

Это шаблонные функциональные объекты, которые распадаются на аналогичный оператор в их функции operator() . Они могут использоваться как аргументы указателя функции.

user1034749 прав, я хочу заявить: другого пути нет, они полностью эквивалентны использованию «сырыми» указателями на функции. Ссылка приведена.

Операторы типа стандартного classа

Вы можете использовать стандартные библиотечные операторы в качестве указателей функций (которые присутствуют как «реальные функции»).

Но вам нужно будет обратиться к соответствующему экземпляру шаблона. Компилятору потребуются соответствующие подсказки для вывода правильного шаблона.

Это работает для меня на MSVC 2012 с использованием operator+ из std::basic_string

 template Test test_function (Test const &a, Test const &b, Test (*FPtr)(Test const &, Test const &)) { return FPtr(a, b); } int main(int argc, char* argv[]) { typedef std::char_traits traits_t; typedef std::allocator alloc_t; std::basic_string a("test"), b("test2"); std::cout << test_function>(a, b, &std::operator+) << std::endl; return 0; } 

Если аргумент шаблона test_function , это приведет к сбою (по крайней мере, для MSVC 2012).

Вы можете использовать то же решение, что и в стандартной библиотеке C ++:

 std::sort (numbers, numbers+5, std::greater()); 

где больше

 template  struct greater : binary_function  { bool operator() (const T& x, const T& y) const {return x>y;} }; 

в вашем случае http://www.cplusplus.com/reference/functional/greater_equal/

О ссылке встроенного оператора.

Вы можете ссылаться на существующий оператор <для любого класса (конечно, если они не являются частными, защищенными или не являются вашим классом / функцией, а не другом). Но opeator <для встроенных типов (bool, short, int, double) это невозможно. Событие, если вы не смотрите на стандарт C ++, который вы можете видеть из моего текста выше.

  • Вопросительный знак и двоеточие в JavaScript
  • Каковы операторы Pointer-to-Member -> * и. * В C ++?
  • В чем разница между «или» и «|» при программировании в xslt?
  • Логический оператор XOR в C ++?
  • Для чего нужен оператор?
  • Разница между & и && в Java?
  • Глобальная перегрузка операторов в F #
  • Каковы основные правила и идиомы для перегрузки оператора?
  • Оператор копирования и оператор присваивания
  • Что делает >> в java?
  • и / или оператор в регулярном выражении
  • Давайте будем гением компьютера.