chromium - base::Bind類成員函式
阿新 • • 發佈:2018-12-20
前言
看到資料上演示base::Bind類成員函式,試試。
不能跑的實現都是假的。
實驗
// @file Z:\chromium\src\base\test\test_by_me\main.cpp // @brief write some test code to study chromium project /** # cd /d Z:\chromium\src\ # gn --ide=vs args out\my_x86_d # gn ls out\my_x86_d > d:\my_tmp\gn_list_target.log # 新加的測試工程位置//base/test:test_by_me # autoninja -C out\my_x86_d test_by_me */ #include <stdlib.h> #include <stdio.h> #include <memory> #include <set> #include <utility> #include "base/bind.h" // for base:Bind() #include "base/logging.h" // for LOG() #include "base/callback.h" // for base ::Callback() #include "base\memory\scoped_refptr.h" // for scoped_refptr<> #include "base\memory\ref_counted.h"// for RefCountedThreadSafe<> #define PROG_NAME "test_my_me" void fn_test(); void fn_test_bind_global_function(); void fn_test_bind_class_member_function(); int main(int argc, char** argv) { printf(">> %s\n", PROG_NAME); // printf("hello chromium\n"); fn_test(); system("pause"); return EXIT_SUCCESS; } /** run result debug.log [1217/140711.850:WARNING:main.cpp(69)] >> fn_test_bind_class_member_function() [1217/140711.850:INFO:main.cpp(70)] 3 */ void fn_test() { // fn_test_bind_global_function(); fn_test_bind_class_member_function(); } class cls_Ref : public base::RefCountedThreadSafe<cls_Ref> { public: cls_Ref() = default; int Foo() { return 3; } void PrintBye() { LOG(INFO) << "bye."; } private: friend class base::RefCountedThreadSafe<cls_Ref>; virtual ~cls_Ref() = default; DISALLOW_COPY_AND_ASSIGN(cls_Ref); }; void fn_test_bind_class_member_function() { // 用base::Bind()繫結類 scoped_refptr<cls_Ref> p_cls_ref = new (cls_Ref); // cls_Ref::Foo 的函式原型是 int(void) base::Callback<int(void)> cb_cls_ref = base::Bind(&cls_Ref::Foo, p_cls_ref); DLOG(WARNING) << ">> fn_test_bind_class_member_function()"; DLOG(INFO) << cb_cls_ref.Run(); // Prints out 3. } int Return5() { return 5; } void fn_test_bind_global_function() { // 用base::Bind()繫結全域性函式 base::Callback<int(void)> func_cb = base::Bind(&Return5); DLOG(WARNING) << ">> fn_test_bind_global_function()"; LOG(INFO) << func_cb.Run(); // Prints 5. DLOG(WARNING) << func_cb.Run(); }
Z:\chromium\src\base\test\BUILD.gn
# Trivial executable which outputs space-delimited argv to stdout, # used for testing. executable("test_child_process") { testonly = true sources = [ "test_child_process.cc", ] deps = [ "//build/config:exe_and_shlib_deps", ] } executable("test_by_me") { sources = [ "test_by_me/main.cpp", ] deps = [ "//base", ] }