[C ++ 11] На станд :: функции и станд :: безвыходном

станд :: функция вызываемая обертка

вызываемые объекты C ++ (Вызываемые объекты) определяются следующим образом:

  1. Указатели на функции: в соответствии с языком C;
  2. указатель на функцию член класса;
  3. Функтор (функтор): также как функция от объекта, перегрузки operator()классов / объекты структуры оператора;
  4. лямбда-выражения.

станд :: функция Callable Объекты обертка (Wrapper), Вызываемые объекты могут быть получены в дополнение к любым указателей функций-членов класса. станд :: функция может быть использована для обработки функции обратного вызова, подобного указатель функции языка C, что позволяет сохранить больше отзывные объекты, и задержать их выполнения, но это может спасти отзывные объекты в дополнении к функции указателям, так что она является более мощной, чем на языке C.

Когда мы StD :: функция экземпляра сигнатура функции (типы функций, в том числе список параметров и возвращаемых значений), то становится пакет, который может вместить все эти функции вызова.

станд :: функция основы использования

#include <iostream>
#include <functional> // std::function

// global function
void func(void) {
  std::cout << __FUNCTION__ << std::endl;
}

class Foo {
public:
  // class static function
  static int foo_func(int a) {
    std::cout << __FUNCTION__ << "(" << a << "):";
    return a;
  }

  // class non-static member function
  int foo_func_nonstatic(int a) {
    std::cout << __FUNCTION__ << "(" << a  << "):";
    return a;
  }
};

class Bar {
public:
  // functor
  int operator()(int a) {
    std::cout << __FUNCTION__ << "(" << a << "):";
    return a;
  }
};

int main() {
  // 传入合适函数签名给std::function模板参数即可绑定对应签名的
  // 普通函数或
  // 类静态成员函数或
  // 借助std::bind绑定类非静态成员函数
  std::function<void(void)> func1 = func;
  std::function<int(int)> func2   = Foo::foo_func;
  Foo foo;
  std::function<int(int)> func3   = std::bind(&Foo::foo_func_nonstatic, &foo,
                                              std::placeholders::_1);

  // 然后,直接像函数一样调用
  func1(); // func
  std::cout << func2(1)  << std::endl; // foo_func(1):1
  std::cout << func3(11) << std::endl; // foo_func_nonstatic(11):11

  // 当函数签名一致时,func2可像一个变量一样复用
  // Bar重载了operator()即成为functor,可直接包装到std::function
  Bar bar;
  func2 = bar;
  std::cout << func2(2) << std::endl; // operator()(2):2

  // 也可绑定lambda表达式
  auto func_lambda = [](int a){
    std::cout << "bind lambda sample(" << a << ")" << std::endl;
  };
  func_lambda(3); // bind lambda sample(3)

  return 0;
}

Так как станд :: функции в качестве значения функции левого принимаемого объекта, он может функционировать в качестве параметра; станд :: функции и указатель на функцию может быть связан, чтобы достичь выполнения задержки функции, то она может быть замещена станд :: Функция станд :: функция в качестве функции обратного вызова.

Примеры станд :: механизма функции обратного вызова для достижения следующего:

#include <iostream>
#include <functional> // std::function

// 任意可调用对象,如普通全局函数
void func_callback(int a) {
  std::cout << __FUNCTION__ << ":Output, a=" << a << std::endl;
}

class Foo {
public:
  explicit Foo(std::function<void(int)> cb)
    :cb_(cb), a_(0) {
  }
  ~Foo() = default;

  // setter
  void set_a(int a) {
    a_ = a;
  }

  void OutputCallback() {
    cb_(a_);
  }

private:
  std::function<void(int)> cb_;
  int a_;
};

int main() {
  // 实例化Foo,并参数注入回调函数
  // 处理
  // 回调输出处理结果
  Foo foo(func_callback);
  foo.set_a(1);
  foo.OutputCallback(); // func_callback:Output, a=1

  return 0;
}

Выше описана использование зОго :: функция связывания вызываемых объектов, а также продемонстрировать экземпляр станда :: функции в качестве примера обратного вызова функции, котор, параметр func_callback обратного вызова к Int, в практических приложениях, такие как лицо интеллектуальный анализ , анализ структуры информации лица в качестве функции обратного вызова указателя аргумента, функция может выводить результат распознавания; класс Foo человеческого лица, связанные с категорией, OutputCallback класс может быть назван анализ лицевой нити, анализ полученных результатов вы можете вызвать выход обратного вызова OutputCallback предоставить пользователю func_callback-х.

Примечание: C ++ 11 предоставляет зЬй :: функции, альтернативно, в языке C функцию указателя в качестве обратного вызова, бывший является C ++ стиль программирования, который является стилем программирования C.

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

// Cocos2dx new callbacks based on C++11
//
// __selector__:回调函数指针
// __target__:回调对象指针
// ##__VA_ARGS__:可变参数列表 
// std::placeholders::_1:不定参数1,调用时由调用函数的参数传入
// std::placeholders::_2:不定参数2,调用时由调用函数的参数传入
// std::placeholders::_3:不定参数3,调用时由调用函数的参数传入
#define CC_CALLBACK_0(__selector__,__target__, ...) std::bind(&__selector__,__target__, ##__VA_ARGS__)
#define CC_CALLBACK_1(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, ##__VA_ARGS__)
#define CC_CALLBACK_2(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, ##__VA_ARGS__)
#define CC_CALLBACK_3(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, ##__VA_ARGS__)

Размышления станд :: функция / станд :: свяжи и абстрактная фабрика, фабричный метод

TODO...

рекомендация

отwww.cnblogs.com/bigosprite/p/11294264.html