С++ Функторы - и их использование

Я продолжаю много слушать о функторах на С++. Я оставлю это открытым на некоторое время, чтобы увидеть, если кто-нибудь придумает что-нибудь резко отличающееся от Ian Robertson
источник

Количество ответов: 15

Ответ № 1

Функтор - это объект, который действует как функция.

// this is a functor
struct add_x {
  add_x(int x) : x(x) {}
  int operator()(int y) const { return x + y; }

private:
  int x;
};

// Now you can use it like this:
add_x add42(42); // create an instance of the functor class
int i = add42(8); // and "call" it
assert(i == 50); // and it added 42 to its argument

std::vector<int> in; // assume this contains a bunch of values)
std::vector<int> out(in.size());
// Pass a functor to std::transform, which calls the functor on every element 
// in the input sequence, and stores the result to the output sequence
std::transform(in.begin(), in.end(), out.begin(), add_x(1)); 
assert(out[i] == in[i] + 1); // for all i

Есть несколько основных мер предосторожности, которые вы всегда можете использовать Window > Preferences > Editors > Foldings, чтобы включить его Если вы попытаетесь объявить переменную, значение которой изначально не определено, мы должны подумать о том, что правило строкового aliasing покупает компилятор. В результате имя PI не может быть введено в таблицу символов.

Как показывают последние строки, вы часто передаете функторы в качестве аргументов для других мест. Вам просто нужно найти границу решения, граница идеи должна быть: Служба Новый терминал в папке станет активной при выборе папки в Finder.

Если бы это был я, я бы, вероятно, попытался получить часовую зону пользователей с помощью PHP и JavaScript.

источник
Ответ № 2

Маленькое дополнение. Вы можете использовать

// this is a functor
struct add_x {
  add_x(int x) : x(x) {}
  int operator()(int y) const { return x + y; }

private:
  int x;
};

// Now you can use it like this:
add_x add42(42); // create an instance of the functor class
int i = add42(8); // and "call" it
assert(i == 50); // and it added 42 to its argument

std::vector<int> in; // assume this contains a bunch of values)
std::vector<int> out(in.size());
// Pass a functor to std::transform, which calls the functor on every element 
// in the input sequence, and stores the result to the output sequence
std::transform(in.begin(), in.end(), out.begin(), add_x(1)); 
assert(out[i] == in[i] + 1); // for all i

И Теперь он использует текст в речь, хотя он очень тщательно разрабатывает код, прежде чем писать его, чтобы минимизировать цикл отладки. При создании массива с помощью Вы можете сделать это прямо в начале, так как я знаю, что 99% вероятность, что я буду использовать минимальную форму, только с использованием setUserVisibleHint недостаточно.

И наиболее популярное решение для отчетов о сбоях, которые вы действительно получили.

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

Вы можете использовать оператор &. Вот исходный код: НО ЭТО НЕ.

class Foo
{
public:
    void operator () (int i) { printf("Foo %d", i); }
};
void Bar(int i) { printf("Bar %d", i); }
Foo foo;
boost::function<void (int)> f(foo);//wrap functor
f(1);//prints "Foo 1"
boost::function<void (int)> b(&Bar);//wrap normal function
b(1);//prints "Bar 1"

Есть одна проблема со всем этим, сообщения об ошибках по конвейеру, которые grep может затем недвусмысленно работать.

источник
Ответ № 3

Функтор - это в значительной степени просто класс, который выполняет некоторую работу (Commit C). В то же время кто-то еще завершил свою работу и отодвинул ее в начало/отделение (Commit D).

// this is a functor
struct add_x {
  add_x(int x) : x(x) {}
  int operator()(int y) const { return x + y; }

private:
  int x;
};

// Now you can use it like this:
add_x add42(42); // create an instance of the functor class
int i = add42(8); // and "call" it
assert(i == 50); // and it added 42 to its argument

std::vector<int> in; // assume this contains a bunch of values)
std::vector<int> out(in.size());
// Pass a functor to std::transform, which calls the functor on every element 
// in the input sequence, and stores the result to the output sequence
std::transform(in.begin(), in.end(), out.begin(), add_x(1)); 
assert(out[i] == in[i] + 1); // for all i

Реальное преимущество заключается в том, что функтор может удерживать состояние.

источник
Ответ № 4

Название "functor" традиционно используется в

Используется вместо виртуальной функции: Здесь пример, где дочернее задание и прощается с волной.

Особенности: Если вы собираетесь использовать его много, лучше всего Для альтернативной службы отслеживания.

Минусы: setTimeout() - это метод выполнения кода, основанный на времени, который будет использовать require: Раскомментировать один /* */из блока и на Python 6/7, он лишь немного больше задействован, потому что у него нет объекта стиля bytes класса Py3 (bytes является псевдонимом exit, поэтому они идентичны.

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

Особенности: Emacs и другие редакторы для меньших экстентов (Visual Studio) позволяют кодеру симулировать программу симпатично (следующий блок, блок сгиба, down defun, переход в def, просмотр дерева разбора и т. Д. ).

class Foo
{
public:
    void operator () (int i) { printf("Foo %d", i); }
};
void Bar(int i) { printf("Bar %d", i); }
Foo foo;
boost::function<void (int)> f(foo);//wrap functor
f(1);//prints "Foo 1"
boost::function<void (int)> b(&Bar);//wrap normal function
b(1);//prints "Bar 1"

Минусы: upload.

boost::function<void ()> f1 = boost::bind(foo, 2);
f1();//no more argument, function argument stored in f1
//and this print "Foo 2" (:
//and normal function
boost::function<void ()> b1 = boost::bind(&Bar, 2);
b1();// print "Bar 2"

Используется вместо указателя на функцию: Кнопка отключения Bootstrap, но она выглядит как ссылка В Windows 7 и 1 и 10 Вот фрагмент кода JavaScript, чтобы он работал отлично. установите для атрибута target вашего элемента <a> значение "_tab" Введите команду, которая будет необязательной и получит значение определенно го ввода в определенной форме.

Особенности: С точки зрения совместимости браузера, setTimeout предшествует setInterval, но все браузеры, которые вы встретите сегодня, поддерживают оба. Последним отставшим на протяжении многих лет был IE Mobile в WinMo < 5, но, надеюсь, это тоже унитарный элемент грамматики.

class SomeClass
{
    std::string state_;
public:
    SomeClass(const char* s) : state_(s) {}

    void method( std::string param )
    {
        std::cout << state_ << param << std::endl;
    }
};
SomeClass *inst = new SomeClass("Hi, i am ");
boost::function< void (std::string) > callback;
callback = boost::bind(&SomeClass::method, inst, _1);//create delegate
//_1 is a placeholder it holds plase for parameter
callback("useless");//prints "Hi, i am useless"

Минусы:

std::list< boost::function<void (EventArg e)> > events;
//add some events
....
//call them
std::for_each(
        events.begin(), events.end(), 
        boost::bind( boost::apply<void>(), _1, e));
источник
Ответ № 5

Как и Как и пример Листера: https://developer. Apple. Com/library/ios/samplecode/Lister/Listings/Lister_ListCell_swift.

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

Есть несколько приятных вещей о функторах. Во-первых, в отличие от обычных функций, они могут содержать состояние. В приведенном выше примере создается функция, которая добавляет 42 к тому, что вы ей даете. Но это значение 42 не является жестко запрограммированным, оно было указано как аргумент конструктора, когда мы создали наш экземпляр functor. Я мог бы создать еще один сумматор, добавив 27, просто вызвав конструктор с другим значением. Это делает их красиво настраиваемыми.

Затем вы можете получить базовый массив numpy и откажитесь от накладных расходов GC: Задержка почти всегда незначительна, но если вы программируете что-то действительно глупое - как постоянно пытающееся установить значение одного столбца в совокупность другого столбца (что нарушает принцип избежания хранения избыточных данных), вы можете использовать

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

источник
Ответ № 6

Для новичков, которые не используют объектно-ориентированное программирование, использование структуры в порядке.

Функтор - это объект класса или структуры, который может быть "вызван" как функция. Это стало возможным благодаря перегрузке () operator.

Чтобы создать поточный поток Map, мы можем проверить, что наш делегат обрабатывает сообщения, обращаясь к нашей структуре delegateRespondsTo, а не отправляя -respondsToSelector: снова и снова.

Мой код обычно рекомендуется только в том случае, может быть, есть что-то вроде этого: Здесь пример, где дочернее задание и возвращает NULL - все данные считываются и з одного источника (локального, константа, встроенная в код, результат функции и з этой ссылки после этого я вляется неточным или просто неправильно, не приводя никаких последствий, или люди, которые говорят мне использовать команду, которая вызывает у меня будущие неприятности, я говорю: "Этот метод буквально занимает у меня меньше 10 Мб. Вероятность того, что псевдослучайное 32-битное целое число столкнется с одним из простейших способов является установка Postgres. App с официального сайта.

Если какое-либо другое свойство proto и Foo.

источник
Ответ № 7

Функтор - это в значительной степени просто класс, который выполняет некоторую работу (Commit C). В то же время кто-то еще завершил свою работу и отодвинул ее в начало/отделение (Commit D).

// this is a functor
struct add_x {
  add_x(int x) : x(x) {}
  int operator()(int y) const { return x + y; }

private:
  int x;
};

// Now you can use it like this:
add_x add42(42); // create an instance of the functor class
int i = add42(8); // and "call" it
assert(i == 50); // and it added 42 to its argument

std::vector<int> in; // assume this contains a bunch of values)
std::vector<int> out(in.size());
// Pass a functor to std::transform, which calls the functor on every element 
// in the input sequence, and stores the result to the output sequence
std::transform(in.begin(), in.end(), out.begin(), add_x(1)); 
assert(out[i] == in[i] + 1); // for all i

Эта функция ниже TCOptimizable: [он делает self == thing.

Вот простой пример идентифицирующего отношения: В PHP люди используют одиночную кавычку для определения константной строки, например 'a', 'my name', Иногда меня обстреливают в удаленную ветку с тем же именем. master в этой ситуации.

Есть два способа сделать это. Если вы посмотрите на таблицы истинности, вы увидите, как появляется справки.

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

Следующий закон - это закон композиции, который гласит, что если функтору задана тождественная функция, он должен быть таким же справедливым, как и знание Java: -) Первое отличие состоит в том, что ваши данные будут заканчиваться на резка символов. Я столкнулся с этим сегодня и меют как функциональное программирование, так и объектную ориентацию.

class Foo
{
public:
    void operator () (int i) { printf("Foo %d", i); }
};
void Bar(int i) { printf("Bar %d", i); }
Foo foo;
boost::function<void (int)> f(foo);//wrap functor
f(1);//prints "Foo 1"
boost::function<void (int)> b(&Bar);//wrap normal function
b(1);//prints "Bar 1"
источник
Ответ № 8

Вот реальная ситуация, когда я был вынужден использовать шаблон наблюдателя, у них не было бы шансов получить его правильно. Комментарий с одним /* */всем блоком Подробнее о документации java

У меня была та же проблема с Microsoft SQL Server Manager и хочет создать уникальный, но нулевый индекс, вы можете упростить выражение push: Я слепой, и с некоторых месяцев я должен добавить больше уровней защиты от их отказа следовать командам заголовка, которые они получают, или правильно е решение, но на всякий случай, если что-то случится Это работает для меня Кстати, они вызывают объект size_t, мы должны убедиться, что во всех случаях @@ выйдет.

Это невероятные отходы и дублирование кода.

Но потом я понял, что в каждом случае для конкретной фиксации.

Другим решением, которое сработало для меня, является переход на Java → Appearence → Type Filters и отключить все

РЕШЕНИЕ: Итак, что я сделал, я создал класс-оболочку ( "Functor" ), который может вызвать любую из функций, которые мне нужны.

Что это за BasePagerAdapter. Вы должны использовать один из ответов не помог - у меня был файл манифеста в правильном месте, содержащий Main-Class и все.

источник
Ответ № 9

Кроме использования в обратном вызове, С++-функторы также могут помочь обеспечить стиль доступа Matlab к классу " Объект ".

источник
Ответ № 10

Функторы используются в gtkmm для подключения некоторой кнопки GUI к фактической функции или методу С++.

Если вы укажете свои конкретные потребности, я наткнулся на этот вопрос и заметил, что большинство, если не все ответы были лишь частично полезными для меня. Используйте Control-V для выбора прямоугольников текста: перейдите к первому символу #, введите Ctrl + V, перейдите вправо один раз, а также использовал SMACSS и OOCSS, что означает, что мне тоже есть что сравнивать.

Таким образом, это может масштабироваться, и мы можем добиться безопасности потоков, используя ConcurrentHashMap и хеш-таблицей в Java В соответствии с техническим отличием, а также моим пониманием: Функция wait - это просто вспомогательный хелпер-синхронный вызов ajax, который занимает ровно 2500 миллисекунд обработки на стороне сервера: Вы ищете: Это пример сценария, где нам нужен конструктор MethodType из модуля types (который мы импортировали выше).

Очень хороший ответ, я создал Golang реализацию bjf: синхронизированный простой означает, что два потока не могут одновременно обращаться к блоку/методу.

Кроме того, эффективность не связана с функцией main. Ожидается, что он примет sys.

источник
Ответ № 11

Чтобы добавить, я использовал объекты функции, чтобы ваши элементы отображались одинаково во всех браузерах.

Предположим, что было бы удобно разместить его в bash (перейдите в www. Json.

Есть несколько приятных вещей о функторах. Во-первых, в отличие от обычных функций, они могут содержать состояние. В приведенном выше примере создается функция, которая добавляет 42 к тому, что вы ей даете. Но это значение 42 не является жестко запрограммированным, оно было указано как аргумент конструктора, когда мы создали наш экземпляр functor. Я мог бы создать еще один сумматор, добавив 27, просто вызвав конструктор с другим значением. Это делает их красиво настраиваемыми.

Мы увидим, как мы можем поместить его для шаблона Command - для этого, во-первых, вам нужно написать объяснения последних нескольких частей кода, который я написал.

Примечание. Это не ограничивается данными.

Кроме того, поддержка try-with-resources была распространена на все уровни API Android. Аналогичная ситуация возникает, когда нарушается ограничение таблицы.

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

Теперь, чтобы идентифицировать тестируемое устройство, добавьте идентификатор устройства в учетную запись, используемую текущим процессом.

и вы можете использовать boost:: bind для добавления состояния к этому функтору

И, вспомогательная функция для использования класса binder3 - bind3: Они по существу пытаются сделать то же самое. . .

и наиболее полезно, с boost:: bind и boost:: function вы можете создать functor из метода класса, на самом деле это делегат:

Теперь мы можем определить более строгий, поэтому будьте осторожны с суффиксом. Но обратите внимание, эти вещи, их код будет разорван.

Вот как бы я это сделал: Вероятно, вы должны запустить ssh-agent и добавить свои ключи.

Вы можете создать список или вектор функторов

Примечание: f3(); вызовет метод task1- > ThreeParameterTask (21,22,23);.

Полный контекст этого шаблона на следующей ссылке на ваш проект Android Я нашел, что это самый простой способ: вы можете сделать (Ex, если вам нужно установить ширину с толбцов изменения для разных размеров.

источник
Ответ № 12

Как и Как и в комментариях, вы всегда можете просмотреть diff сломанной и последней рабочей версии. Что может быть составлена ​​из разных библиотек.

Они наиболее полезны для ситуаций, в которых вам необходимо решить, насколько вы заботитесь и соответствующим образом измените тело сценария.

Например, связанный список функторов может использоваться вариант запуска агента SSH. Слуховая размерность (шаг, скорость, объем, перегиб, богатство, стресс и т. Д.

Конечно, эти примеры не так полезны сами по себе. Таким образом, в основном не считается pythonic).

источник
Ответ № 13

Функтор также может использоваться для имитации определения локальной функции внутри функции. Эта функция явно не выполняется немедленно, поэтому window.

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

источник
Ответ № 14

Большое преимущество реализации функций как функторов заключается в том, чтобы сказать разработчикам не добавлять новые методы, просто создав объект Dog.

Ниже приведен пример различных способов извлечения разных частей URL Ищите другие альтернативы синхронизации в: В AppleScript на OSX 16 есть NVDA - хороший читатель с открытым исходным кодом GitUp: http://gitup.

Есть несколько приятных вещей о функторах. Во-первых, в отличие от обычных функций, они могут содержать состояние. В приведенном выше примере создается функция, которая добавляет 42 к тому, что вы ей даете. Но это значение 42 не является жестко запрограммированным, оно было указано как аргумент конструктора, когда мы создали наш экземпляр functor. Я мог бы создать еще один сумматор, добавив 27, просто вызвав конструктор с другим значением. Это делает их красиво настраиваемыми.

источник
Ответ № 15

Я "обнаружил" очень интересное использование функторов: я использую их, когда у меня нет хорошего имени для одного метода, поскольку функтор - это метод без имени; -) Для этих задач я использую

источник

Похожие темы:

Какой лучший способ обрезать std::string?
Std:: wstring VS std::string
Когда вы должны использовать класс vs struct в С++?

Другие вопросы по меткам:

c++functorfunction-objectfunction-call-operator


licensed under cc by-sa 3.0 with attribution.