каталог
станд :: функция вызываемая обертка
вызываемые объекты C ++ (Вызываемые объекты) определяются следующим образом:
- Указатели на функции: в соответствии с языком C;
- указатель на функцию член класса;
- Функтор (функтор): также как функция от объекта, перегрузки
operator()
классов / объекты структуры оператора; - лямбда-выражения.
станд :: функция 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...