網(wǎng)站建設(shè)模式有哪些方面網(wǎng)絡(luò)推廣怎么找客戶
一、使用方法
1.定義一個函數(shù)指針
typedef int (*pCallback)(int a, int b);
2.定義一個帶參的回調(diào)函數(shù)(注釋部分是普通回調(diào)函數(shù),不用定義第一步里的函數(shù)指針)
//帶參
int oneCallback(int a, int b, pCallback p)
//int oneCallback(int a, int b, int (*pCallback)(int a, int b))
{return p(a, b);//return pCallback(a, b);
}
3.不帶參或者是固定值或使用全局變量的使用(注釋部分同上解釋)
//特定值
int twoCallback(pCallback p)
//int twoCallback(int (*pCallback)(int a, int b))
{return p(2,8);//return pCallback(2, 8);
}
4.實(shí)現(xiàn)回調(diào)函數(shù)
// 回調(diào)函數(shù)
int add(int a, int b)
{return a+b;
}
//第一種, 帶參
int (*p)(int a, int b) = add;
p(0,6);
//第一種, 帶參
oneCallback(1, 7, add);//第二種, 特定值
twoCallback(add);
二、實(shí)例說明
以std::for_each()
為例
template<class InputIt, class UnaryFunction>
UnaryFunction for_each(InputIt first, InputIt last, UnaryFunction f)
{for (; first != last; ++first) {f(*first);}return f;
}
int print(int i)
{return i;
}
int add(int& i)
{return i += 1;
}
int sub(int& i)
{return i -= 1;
}
std::vector<int> vec{0,1,2,3,4,5,6};
std::for_each(vec.begin(), vec.end(), print); //return _0_1_2_3_4_5_6
std::for_each(vec.begin(), vec.end(), add);
std::for_each(vec.begin(), vec.end(), print); //return _1_2_3_4_5_6_7
std::for_each(vec.begin(), vec.end(), sub);
std::for_each(vec.begin(), vec.end(), print); //return _-1_0_1_2_3_4_5
//函數(shù)指針
typedef void (*pcap_handler)(u_char * user, const struct pcap_pkthdr *header, const u_char *pkt_data);//調(diào)用回調(diào)函數(shù)(處理數(shù)據(jù)并判斷是否調(diào)用回調(diào)函數(shù))
int pcap_loop(pcap_t * handler, int cnt, pcap_handler callBack, u_char * user);/* 回調(diào)函數(shù),用來處理數(shù)據(jù)包 */
void packet_handler(u_char *user, const struct pcap_pkthdr *header, const u_char *pkt_data)
{Q_UNUSED(dumpfile);_data_ data;data.tv_sec = header->ts.tv_sec;data.tv_usec = header->ts.tv_usec;data.len = header->len;//data.pkt_data = pkt_data;data.pkt_data = (const u_char*)malloc(data.len+1);memcpy((void*)data.pkt_data, pkt_data, data.len);all_data_vec.push_back(data);
}
//使用
pcap_loop(handle, 0, packet_handler, NULL)