Как получить указатель на встроенный арифметический оператор? [Дубликат]

При запуске java с опцией -cp, как описано в Windows PowerShell, вы можете получить ошибку, которая выглядит примерно так:

The term `ClassName` is not recognized as the name of a cmdlet, function, script ...

Чтобы PowerShell принял команду, аргументы опции -cp должны содержаться в кавычках, как в:

java -cp 'someDependency.jar;.' ClassName

Формирование команды таким образом должно позволить Java обрабатывать аргументы classpath правильно.

12
задан πάντα ῥεῖ 16 July 2013 в 22:38
поделиться

2 ответа

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

Почему у вас не может быть указателей на них:

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

< blockquote>

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

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

Способ решения этой проблемы:

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

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

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

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

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

  • equal_to
  • not_equal_to
  • больше, меньше
  • more_equal
  • less_equal

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

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

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

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

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

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

template<class Test>
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<char> traits_t;
   typedef std::allocator<char> alloc_t;
   std::basic_string<char, traits_t, alloc_t> a("test"), b("test2");
   std::cout << test_function<std::basic_string<char, traits_t, alloc_t>>(a, b, &std::operator+) << std::endl;
   return 0;
}

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

18
ответ дан Community 25 August 2018 в 02:54
поделиться

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

std::sort (numbers, numbers+5, std::greater<int>());

, где больше

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

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

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

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

9
ответ дан πάντα ῥεῖ 25 August 2018 в 02:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: