第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用C ++類成員函數(shù)作為C回調(diào)函數(shù)

使用C ++類成員函數(shù)作為C回調(diào)函數(shù)

C++ C
偶然的你 2019-08-28 08:59:20
使用C ++類成員函數(shù)作為C回調(diào)函數(shù)我有一個C庫,需要注冊回調(diào)函數(shù)來定制一些處理?;卣{(diào)函數(shù)的類型是int a(int *, int *)。我正在編寫類似于以下內(nèi)容的C ++代碼,并嘗試將C ++類函數(shù)注冊為回調(diào)函數(shù):class A {   public:    A();    ~A();    int e(int *k, int *j);};A::A(){    register_with_library(e)}intA::e(int *k, int *e){   return 0;}A::~A() {}編譯器拋出以下錯誤:In constructor 'A::A()',error:  argument of type ‘int (A::)(int*, int*)’ does not match ‘int (*)(int*, int*)’.我的問題:首先是可以注冊一個C ++類的memeber函數(shù),就像我想要做的那樣,如果是這樣的話怎么樣?(我在http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html上閱讀了32.8 。但在我看來它并沒有解決問題)是否有替代/更好的方法來解決這個問題?
查看完整描述

3 回答

?
汪汪一只貓

TA貢獻1898條經(jīng)驗 獲得超8個贊

如果成員函數(shù)是靜態(tài)的,則可以這樣做。

類A的非靜態(tài)成員函數(shù)具有隱式的第一個類型參數(shù),class A*該參數(shù)對應于指針。這就是為什么如果回調(diào)的簽名也有第一個class A*類型的參數(shù),你只能注冊它們。


查看完整回答
反對 回復 2019-08-28
?
縹緲止盈

TA貢獻2041條經(jīng)驗 獲得超4個贊

如果成員函數(shù)不是靜態(tài)的,你也可以這樣做,但它需要更多的工作(參見將C ++函數(shù)指針轉(zhuǎn)換為c函數(shù)指針):

#include <stdio.h>#include <functional>template <typename T>struct Callback;template <typename Ret, typename... Params>struct Callback<Ret(Params...)> {
   template <typename... Args> 
   static Ret callback(Args... args) {                    
      func(args...);  
   }
   static std::function<Ret(Params...)> func; };template <typename Ret, typename... Params>std::function<Ret(Params...)> Callback<Ret(Params...)>::func;void register_with_library(int (*func)(int *k, int *e)) {
   int x = 0, y = 1;
   int o = func(&x, &y);
   printf("Value: %i\n", o);}class A {
   public:
      A();
      ~A();
      int e(int *k, int *j);};typedef int (*callback_t)(int*,int*);A::A() {
   Callback<int(int*,int*)>::func = std::bind(&A::e, this, std::placeholders::_1, std::placeholders::_2);
   callback_t func = static_cast<callback_t>(Callback<int(int*,int*)>::callback);      
   register_with_library(func);      }int A::e(int *k, int *j) {
   return *k - *j;}A::~A() { }int main() {
   A a;}

這個例子在它編譯的意義上是完整的:

g++ test.cpp -std=c++11 -o test

你需要c++11國旗。在您看到的代碼中,register_with_library(func)調(diào)用func了動態(tài)綁定到成員函數(shù)的靜態(tài)函數(shù)e。


查看完整回答
反對 回復 2019-08-28
  • 3 回答
  • 0 關(guān)注
  • 1532 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號