亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++中事件機(jī)制的簡潔實(shí)現(xiàn)及需要放棄的特性

2020-01-26 16:22:18
字體:
供稿:網(wǎng)友
事件模型是被廣泛使用的好東西,但是C++標(biāo)準(zhǔn)庫里沒有現(xiàn)成的,其他實(shí)現(xiàn)又復(fù)雜或者不優(yōu)雅,比如需要使用宏?,F(xiàn)在VC11可以用在XP下了,那么就痛快的拿起C++11提供的先進(jìn)設(shè)施組合出一個(gè)輕便的實(shí)現(xiàn)吧。

為了達(dá)到簡潔的目的,需要放棄一些特性
1、不支持判斷函數(shù)是否已經(jīng)綁定過(因?yàn)閟td::function不提供比較方法,自己實(shí)現(xiàn)function的話代碼又變多了)
2、需要使用者接收返回的回調(diào)函數(shù)標(biāo)識(shí)來移除事件綁定(原因同上)
3、事件沒有返回值,不支持回調(diào)函數(shù)優(yōu)先級、條件回調(diào)等事件高級特性(比如返回所有處理結(jié)果中的最大最小值;只回調(diào)與指定參數(shù)匹配的事件處理函數(shù))
4、事件參數(shù)理論上無限,實(shí)際上有限,一般支持0~10個(gè)參數(shù)(VC11還沒有支持變長模板參數(shù),GCC有了。不過可以通過缺省模板參數(shù)和偏特化來模擬,所以理論上無限制)
5、不是線程安全的

:3、5兩條可以通過引入策略模式來提供靈活支持,就像標(biāo)準(zhǔn)庫和Loki做的那樣,實(shí)現(xiàn)一個(gè)完整的事件機(jī)制。

最簡單的實(shí)現(xiàn)
復(fù)制代碼 代碼如下:

#include <map>
#include <functional>
using namespace std;
template<class Param1, class Param2>
class Event
{
typedef void HandlerT(Param1, Param2);
int m_handlerId;
public:
Event() : m_handlerId(0) {}
template<class FuncT> int addHandler(FuncT func)
{
m_handlers.emplace(m_handlerId, forward<FuncT>(func));
return m_handlerId++;
}
void removeHandler(int handlerId)
{
m_handlers.erase(handlerId);
}
void operator ()(Param1 arg1, Param2 arg2)
{
for ( const auto& i : m_handlers )
i.second(arg1, arg2);
}
private:
map<int, function<HandlerT>> m_handlers;
};

addHandler把回調(diào)函數(shù)完美轉(zhuǎn)發(fā)給std::function,讓標(biāo)準(zhǔn)庫來搞定各種重載,然后返回一個(gè)標(biāo)識(shí)符用來注銷綁定。試一下,工作的不錯(cuò):
復(fù)制代碼 代碼如下:

void f1(int, int)
{
puts("f1()");
}
struct F2
{
void f(int, int)
{
puts("f2()");
}
void operator ()(int, int)
{
puts("f3()");
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Event<int, int> e;
int id = e.addHandler(f1);
e.removeHandler(id);
using namespace std::placeholders;
F2 f2;
e.addHandler(bind(&F2::f, f2, _1, _2));
e.addHandler(bind(f2, _1, _2));
e.addHandler([](int, int) {
puts("f4()");
});
e(1, 2);
return 0;
}

雖然這里有一個(gè)小小的缺點(diǎn),對于仿函數(shù),如果想使用它的指針或引用是不可以直接綁定的,需要這樣做:
復(fù)制代碼 代碼如下:

e.addHandler(ref(f2));
e.addHandler(ref(*pf2)); // pf2是指向f2的指針 但是使用仿函數(shù)對象指針的情形不多,也不差多敲幾個(gè)

字符,何況在有Lambda表達(dá)式的情況下呢?
改進(jìn)
1、有人不喜歡bind,用起來麻煩,放到addhandler里面去:
復(fù)制代碼 代碼如下:

template<class ObjT, class FuncT> int addHandler(ObjT obj, FuncT func)
{
using namespace std::placeholders;
m_handlers.emplace(m_handlerId, std::bind(func, std::forward<ObjT>(obj), _1, _2));
return m_handlerId++;
}

2、擴(kuò)展參數(shù)個(gè)數(shù)。沒有變長模板參數(shù),變通一下:
復(fù)制代碼 代碼如下:

struct NullType {};
template<class P1 = Private::NullType, class P2 = Private::NullType>
class Event
{
public:
template<class ObjT, class FuncT> int addHandler(ObjT obj, FuncT func)
{
using namespace std::placeholders;
m_handlers.emplace(m_handlerId, std::bind(func, std::forward<ObjT>(obj), _1, _2));
return m_handlerId++;
}
void operator ()(P1 arg1, P2 arg2)
{
for ( const auto& i : m_handlers )
i.second(arg1, arg2);
}
};
template<>
class Event<Private::NullType, Private::NullType>
{
public:
template<class ObjT, class FuncT> int addHandler(ObjT obj, FuncT func)
{
using namespace std::placeholders;
m_handlers.emplace(m_handlerId, std::bind(func, std::forward<ObjT>(obj)));
return m_handlerId++;
}
void operator ()()
{
for ( const auto& i : m_handlers )
i.second();
}
};
template<class P1>
class Event<P1, Private::NullType>
{
public:
template<class ObjT, class FuncT> int addHandler(ObjT obj, FuncT func)
{
using namespace std::placeholders;
m_handlers.emplace(m_handlerId, std::bind(func, std::forward<ObjT>(obj), _1));
return m_handlerId++;
}
void operator ()(P1 arg1)
{
for ( const auto& i : m_handlers )
i.second(arg1);
}
};

現(xiàn)在支持0~2個(gè)參數(shù)了。注意到各個(gè)模板里有公共代碼,提取出來放進(jìn)基類,然后要做的就是打開文本生成器了
完整代碼
代碼下載
復(fù)制代碼 代碼如下:

View Code
#pragma once
#include <map>
#include <functional>
namespace Utility
{
namespace Private
{
struct NullType {};
template<class HandlerT>
class EventBase
{
public:
EventBase() : m_handlerId(0) {}
template<class FuncT> int addHandler(FuncT func)
{
m_handlers.emplace(m_handlerId, std::forward<FuncT>(func));
return m_handlerId++;
}
void removeHandler(int handlerId)
{
m_handlers.erase(handlerId);
}
protected:
int m_handlerId;
std::map<int, std::function<HandlerT>> m_handlers;
};
}
template<class P1 = Private::NullType, class P2 = Private::NullType, class P3 = Private::NullType, class P4 = Private::NullType, class P5 = Private::NullType, class P6 = Private::NullType, class P7 = Private::NullType, class P8 = Private::NullType, class P9 = Private::NullType, class P10 = Private::NullType>
class Event
: public Private::EventBase<void (P1, P2, P3, P4, P5, P6, P7, P8, P9, P10)>
{
public:
using Private::EventBase<void (P1, P2, P3, P4, P5, P6, P7, P8, P9, P10)>::addHandler;
template<class ObjT, class FuncT> int addHandler(ObjT obj, FuncT func)
{
using namespace std::placeholders;
m_handlers.emplace(m_handlerId, std::bind(func, std::forward<ObjT>(obj), _1, _2, _3, _4, _5, _6, _7, _8, _9, _10));
return m_handlerId++;
}
void operator ()(P1 arg1, P2 arg2, P3 arg3, P4 arg4, P5 arg5, P6 arg6, P7 arg7, P8 arg8, P9 arg9, P10 arg10)
{
for ( const auto& i : m_handlers )
i.second(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10);
}
};
template<>
class Event<Private::NullType, Private::NullType, Private::NullType, Private::NullType, Private::NullType, Private::NullType, Private::NullType, Private::NullType, Private::NullType, Private::NullType>
: public Private::EventBase<void ()>
{
public:
using Private::EventBase<void ()>::addHandler;
template<class ObjT, class FuncT> int addHandler(ObjT const obj, FuncT func)
{
m_handlers.emplace(m_handlerId, std::bind(func, obj));
return m_handlerId++;
}
void operator ()()
{
for ( const auto& i : m_handlers )
i.second();
}
};
template<class P1>
class Event<P1, Private::NullType, Private::NullType, Private::NullType, Private::NullType, Private::NullType, Private::NullType, Private::NullType, Private::NullType, Private::NullType>
: public Private::EventBase<void (P1)>
{
public:
using Private::EventBase<void (P1)>::addHandler;
template<class ObjT, class FuncT> int addHandler(ObjT obj, FuncT func)
{
using namespace std::placeholders;
m_handlers.emplace(m_handlerId, std::bind(func, std::forward<ObjT>(obj), _1));
return m_handlerId++;
}
void operator ()(P1 arg1)
{
for ( const auto& i : m_handlers )
i.second(arg1);
}
};
template<class P1, class P2>
class Event<P1, P2, Private::NullType, Private::NullType, Private::NullType, Private::NullType, Private::NullType, Private::NullType, Private::NullType, Private::NullType>
: public Private::EventBase<void (P1, P2)>
{
public:
using Private::EventBase<void (P1, P2)>::addHandler;
template<class ObjT, class FuncT> int addHandler(ObjT obj, FuncT func)
{
using namespace std::placeholders;
m_handlers.emplace(m_handlerId, std::bind(func, std::forward<ObjT>(obj), _1, _2));
return m_handlerId++;
}
void operator ()(P1 arg1, P2 arg2)
{
for ( const auto& i : m_handlers )
i.second(arg1, arg2);
}
};
template<class P1, class P2, class P3>
class Event<P1, P2, P3, Private::NullType, Private::NullType, Private::NullType, Private::NullType, Private::NullType, Private::NullType, Private::NullType>
: public Private::EventBase<void (P1, P2, P3)>
{
public:
using Private::EventBase<void (P1, P2, P3)>::addHandler;
template<class ObjT, class FuncT> int addHandler(ObjT obj, FuncT func)
{
using namespace std::placeholders;
m_handlers.emplace(m_handlerId, std::bind(func, std::forward<ObjT>(obj), _1, _2, _3));
return m_handlerId++;
}
void operator ()(P1 arg1, P2 arg2, P3 arg3)
{
for ( const auto& i : m_handlers )
i.second(arg1, arg2, arg3);
}
};
template<class P1, class P2, class P3, class P4>
class Event<P1, P2, P3, P4, Private::NullType, Private::NullType, Private::NullType, Private::NullType, Private::NullType, Private::NullType>
: public Private::EventBase<void (P1, P2, P3, P4)>
{
public:
using Private::EventBase<void (P1, P2, P3, P4)>::addHandler;
template<class ObjT, class FuncT> int addHandler(ObjT obj, FuncT func)
{
using namespace std::placeholders;
m_handlers.emplace(m_handlerId, std::bind(func, std::forward<ObjT>(obj), _1, _2, _3, _4));
return m_handlerId++;
}
void operator ()(P1 arg1, P2 arg2, P3 arg3, P4 arg4)
{
for ( const auto& i : m_handlers )
i.second(arg1, arg2, arg3, arg4);
}
};
template<class P1, class P2, class P3, class P4, class P5>
class Event<P1, P2, P3, P4, P5, Private::NullType, Private::NullType, Private::NullType, Private::NullType, Private::NullType>
: public Private::EventBase<void (P1, P2, P3, P4, P5)>
{
public:
using Private::EventBase<void (P1, P2, P3, P4, P5)>::addHandler;
template<class ObjT, class FuncT> int addHandler(ObjT obj, FuncT func)
{
using namespace std::placeholders;
m_handlers.emplace(m_handlerId, std::bind(func, std::forward<ObjT>(obj), _1, _2, _3, _4, _5));
return m_handlerId++;
}
void operator ()(P1 arg1, P2 arg2, P3 arg3, P4 arg4, P5 arg5)
{
for ( const auto& i : m_handlers )
i.second(arg1, arg2, arg3, arg4, arg5);
}
};
template<class P1, class P2, class P3, class P4, class P5, class P6>
class Event<P1, P2, P3, P4, P5, P6, Private::NullType, Private::NullType, Private::NullType, Private::NullType>
: public Private::EventBase<void (P1, P2, P3, P4, P5, P6)>
{
public:
using Private::EventBase<void (P1, P2, P3, P4, P5, P6)>::addHandler;
template<class ObjT, class FuncT> int addHandler(ObjT obj, FuncT func)
{
using namespace std::placeholders;
m_handlers.emplace(m_handlerId, std::bind(func, std::forward<ObjT>(obj), _1, _2, _3, _4, _5, _6));
return m_handlerId++;
}
void operator ()(P1 arg1, P2 arg2, P3 arg3, P4 arg4, P5 arg5, P6 arg6)
{
for ( const auto& i : m_handlers )
i.second(arg1, arg2, arg3, arg4, arg5, arg6);
}
};
template<class P1, class P2, class P3, class P4, class P5, class P6, class P7>
class Event<P1, P2, P3, P4, P5, P6, P7, Private::NullType, Private::NullType, Private::NullType>
: public Private::EventBase<void (P1, P2, P3, P4, P5, P6, P7)>
{
public:
using Private::EventBase<void (P1, P2, P3, P4, P5, P6, P7)>::addHandler;
template<class ObjT, class FuncT> int addHandler(ObjT obj, FuncT func)
{
using namespace std::placeholders;
m_handlers.emplace(m_handlerId, std::bind(func, std::forward<ObjT>(obj), _1, _2, _3, _4, _5, _6, _7));
return m_handlerId++;
}
void operator ()(P1 arg1, P2 arg2, P3 arg3, P4 arg4, P5 arg5, P6 arg6, P7 arg7)
{
for ( const auto& i : m_handlers )
i.second(arg1, arg2, arg3, arg4, arg5, arg6, arg7);
}
};
template<class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8>
class Event<P1, P2, P3, P4, P5, P6, P7, P8, Private::NullType, Private::NullType>
: public Private::EventBase<void (P1, P2, P3, P4, P5, P6, P7, P8)>
{
public:
using Private::EventBase<void (P1, P2, P3, P4, P5, P6, P7, P8)>::addHandler;
template<class ObjT, class FuncT> int addHandler(ObjT obj, FuncT func)
{
using namespace std::placeholders;
m_handlers.emplace(m_handlerId, std::bind(func, std::forward<ObjT>(obj), _1, _2, _3, _4, _5, _6, _7, _8));
return m_handlerId++;
}
void operator ()(P1 arg1, P2 arg2, P3 arg3, P4 arg4, P5 arg5, P6 arg6, P7 arg7, P8 arg8)
{
for ( const auto& i : m_handlers )
i.second(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
}
};
template<class P1, class P2, class P3, class P4, class P5, class P6, class P7, class P8, class P9>
class Event<P1, P2, P3, P4, P5, P6, P7, P8, P9, Private::NullType>
: public Private::EventBase<void (P1, P2, P3, P4, P5, P6, P7, P8, P9)>
{
public:
using Private::EventBase<void (P1, P2, P3, P4, P5, P6, P7, P8, P9)>::addHandler;
template<class ObjT, class FuncT> int addHandler(ObjT obj, FuncT func)
{
using namespace std::placeholders;
m_handlers.emplace(m_handlerId, std::bind(func, std::forward<ObjT>(obj), _1, _2, _3, _4, _5, _6, _7, _8, _9));
return m_handlerId++;
}
void operator ()(P1 arg1, P2 arg2, P3 arg3, P4 arg4, P5 arg5, P6 arg6, P7 arg7, P8 arg8, P9 arg9)
{
for ( const auto& i : m_handlers )
i.second(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9);
}
};
} // namespace Utility

測試代碼
各種綁定方式
復(fù)制代碼 代碼如下:

View Code
#include "Event.h"
using namespace std;
void f1(int, int)
{
puts("f1()");
}
struct F2
{
F2() { puts("F2 construct"); }
F2(const F2 &) { puts("F2 copy"); }
F2(F2 &&) { puts("F2 move"); }
F2& operator=(const F2 &) { puts("F2 copy assign"); return *this; }
F2& operator=(F2 &&) { puts("F2 move assign"); return *this; }
void f(int, int)
{
puts("f2()");
}
void fc(int, int) const
{
puts("f2c()");
}
};
struct F3
{
F3() { puts("F3 construct"); }
F3(const F3 &) { puts("F3 copy"); }
F3(F3 &&) { puts("F3 move"); }
F3& operator=(const F3 &) { puts("F3 copy assign"); return *this; }
F3& operator=(F3 &&) { puts("F3 move assign"); return *this; }
void operator ()(int, int) const
{
puts("f3()");
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Utility::Event<int, int> e;
// 一般函數(shù)
e.addHandler(f1);
int id = e.addHandler(&f1);
e.removeHandler(id); // 移除事件處理函數(shù)
// 成員函數(shù)
using namespace std::placeholders;
F2 f2;
const F2 *pf2 = &f2;
e.addHandler(bind(&F2::f, &f2, _1, _2)); // std::bind
e.addHandler(&f2, &F2::f);
e.addHandler(pf2, &F2::fc); // 常量指針
puts("----addHandler(f2, &F2::f)----");
e.addHandler(f2, &F2::f); // 對象拷貝構(gòu)造
puts("----addHandler(F2(), &F2::f)----");
e.addHandler(F2(), &F2::f); // 對象轉(zhuǎn)移構(gòu)造
puts("--------");
// 仿函數(shù)
F3 f3;
const F3 *pf3 = &f3;
puts("----addHandler(f3)----");
e.addHandler(f3); // 對象拷貝構(gòu)造
puts("----addHandler(F3())----");
e.addHandler(F3()); // 對象轉(zhuǎn)移構(gòu)造
puts("--------");
e.addHandler(ref(f3)); // 引用仿函數(shù)對象
e.addHandler(ref(*pf3)); // 引用仿函數(shù)常量對象
puts("--------");
// Lambda表達(dá)式
e.addHandler([](int, int) {
puts("f4()");
});
// 激發(fā)事件
e(1, 2);
return 0;
}
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
天堂社区 天堂综合网 天堂资源最新版| 99热在线网站| 可以www视频| 尤物视频在线看| 狠狠鲁男人天堂| 黄色网战入口| 99精品国产99久久久久久白柏| 午夜国产一区二区三区| 91在线免费观看网站| 99一区二区| 国产成人av毛片| 精品一区二区三区日韩| 成人h精品动漫一区二区三区| 夜色资源站国产www在线视频| 久久久久久99| 精品黑人一区二区三区在线观看| 精品国产依人香蕉在线精品| 免费在线播放第一区高清av| 国产不卡在线| 成人ar影院免费观看视频| 三级av在线播放| 亚洲一二区视频| 国产在线日韩精品| 麻豆成人久久精品二区三区小说| 久久中文字幕在线视频| 成**人特级毛片www免费| 亚洲三级av在线| 欧美一区二区三区不卡视频| 天天骑天天射| 91精品国产91久久久久久吃药| 久久影院一区| 国产wwww| 任我爽精品视频在线播放| 欧美精品一区在线发布| 日本vs亚洲vs韩国一区三区| 三级a三级三级三级a十八发禁止| 在线免费看91| 已婚少妇美妙人妻系列| 视频在线你懂的| 色噜噜日韩精品欧美一区二区| 高清视频在线观看一区| 日本高清视频在线| 日韩精品中午字幕| 青娱乐国产在线视频| 2021国产精品久久精品| 欧美猛男男男激情videos| 亚洲熟妇一区二区三区| 999在线观看精品免费不卡网站| 高清国产一区| 999久久久免费精品国产牛牛| 国产成人在线免费看| 九九在线观看视频| 国产成人a人亚洲精品无码| 综合久久综合久久| 97视频在线播放| 亚洲欧洲日本mm| 亚洲影院理伦片| 蜜桃视频在线观看视频| 日本少妇激情视频| 亚洲国产精品精华液ab| 精品一区二区三区日韩| 亚洲精品视频自拍| 欧美性高清videossexo| 国产69精品久久久久999小说| 女人扒开腿免费视频app| 欧美艾v福利视频在线观看| 亚洲视频国产视频| 全国精品免费看| 国产一区二区三区四区五区美女| 成人性生交大片免费观看网站| 91久久精品日日躁夜夜躁国产| 成人免费视频免费观看| av网站大全在线观看| 国内精彩免费自拍视频在线观看网址| 欧美三级韩国三级日本一级| 免费看欧美美女黄的网站| 久久久久久国产精品免费无遮挡| 久久www成人_看片免费不卡| 久久se精品一区二区| 亚洲成人在线视频播放| 国产精品成久久久久三级| 大肉大捧一进一出好爽| 另类人妖一区二区av| 色就色 综合激情| 5566中文字幕一区二区| 一区二区视频在线看| 91视频免费进入| 国产狂喷白浆在线观看视频| 国产成人av电影在线| 美女露胸一区二区三区| 国产在线2020| 91精东传媒理伦片在线观看| 肉大捧一出免费观看网站在线播放| 丁香花在线电影小说观看| 欧美二区乱c少妇| 三级在线看中文字幕完整版| 91麻豆国产福利在线观看宅福利| 日本va欧美va欧美va精品| 久久久无码人妻精品无码| 一本大道熟女人妻中文字幕在线| 在线观看xxxx| 99国产精品一区| 成年人福利网站| 欧美疯狂爱爱xxxxbbbb| 私人高清影院 强乱中文字| 国产成人免费视频网站视频社区| 亚洲免费av片| gogogo高清在线观看免费完整版| 精品久久久久久久久久久下田| 可以免费看污视频的网站| 日本久久高清视频| 成人av手机在线| 久久久久这里只有精品| wwwxxxx在线观看| aaa国产精品视频| 精品免费在线视频| 亚洲成在人线免费| 国产一区二区女内射| 亚洲啪啪91| 久热中文字幕精品视频在线| 精品黑人一区二区三区观看时间| 亚洲欧美日韩国产一区二区三区| 蜜臀av中文字幕| 欧美亚洲精品在线| 国产欧美日本在线| 我不卡一区二区| 国产一级片网址| 国产91精品青草社区| 国产福利短视频| 黄网站色欧美视频| 午夜影院免费体验区| 久久久久久91| 欧美日韩国产欧| 激情都市一区二区| 亚洲欧洲午夜| 免费黄色大片| 男男视频亚洲欧美| 国产一区二区三区四区尤物| 国产在线资源一区| 中文在线观看免费网站| 国产 日韩 欧美 综合| 中国美女乱淫免费看视频| 久久天堂av综合合色| 欧美日韩一区二区三区视频播放| 踪合国产第二页| 美女久久一区| 欧美另类一区二区| 69国产精品视频| 国产999在线观看| 手机av免费观看| 波多野结衣视频播放| 久久狠狠高潮亚洲精品| 中文不卡1区2区3区| 中文字幕高清一区| 久久在线免费观看| 欧美成va人片在线观看| 日韩风俗一区 二区| 一级欧美一级日韩片| www.国产视频.com| 久久精品无码一区二区三区毛片| 亚洲成人激情在线| 欧美成人有码| 超碰精品一区二区三区乱码| 玖玖玖视频精品| 国产91精品入口| 波多野结衣三级在线| 91九色在线视频| 一区二区三区国产在线| 色婷婷综合网站| 中文一区二区在线观看| 成人黄色在线观看| 中文字幕中文在线| 欧美久久精品一级c片| 亚洲做受高潮无遮挡| 黄网动漫久久久| 欧美久久精品一级黑人c片| 日韩在线视频观看正片免费网站| 在线看的网站你懂| 九九99久久精品在免费线bt| 国内自拍一区| 亚洲国产综合久久| 国产免费的av| julia一区二区中文久久94| 亚洲黄色成人久久久| 在线资源av| 国产一区免费视频| 最近中文字幕mv免费高清视频8| 日韩女优在线视频| 国产精品果冻传媒潘| 不卡的av中文字幕| 里番在线播放| 蜜芽在线视频| 国产一区三区三区| 国产88在线观看入口| 欧美精品一区二区三区四区五区| xxx国产hd| a视频网址在线观看| 在线免费观看黄| 亚洲男人天堂久| 欧美性猛交7777777| 精灵使的剑舞无删减版在线观看| 日韩视频1区| 日韩欧美色视频| 美女被爆操网站| 色综合免费视频| www免费视频| 青青青免费视频在线2| 精品国产凹凸成av人网站| 日韩一级视频| 亚洲av综合色区无码一二三区| 狠狠色综合网站久久久久久久| 国内爆初菊对白视频| 91激情视频在线观看| 国产v综合v| 欧美性xxxxx| 日韩免费不卡av| 精品一区二区不卡| 欧美va亚洲va在线观看蝴蝶网| 欧美gvvideo网站| 91pony九色| 女人被狂躁到高潮的免费| 精品久久一二三区| 影音先锋人妻啪啪av资源网站| 亚洲国产欧美一区二区丝袜黑人| аⅴ资源天堂资源库在线| 天天干天天操天天爱| 成人欧美magnet| 成人6969www免费视频| www国产91| 欧美日韩一区二区三区电影| 国产日本欧美视频| 性欧美办公室18xxxxhd| 欧美色图综合网| 精品国产乱码91久久久久久网站| 精品国产一级毛片| 国产精华一区二区三区| 777视频在线观看| 欧美日韩一级二级| 三级在线观看免费大全| 91看片破解版| 亚洲黄色一级大片| 精品国偷自产国产一区| 久久精品一区二区免费播放| 在线人成日本视频| 视频福利在线| 亚洲激情 国产| 国产在线三区| 老司机午夜免费精品视频| 人在线成免费视频| 99国产精品免费视频观看| 免费看黄色91| 日本黄色电影网站| 久久综合九色综合欧美狠狠| 91成人午夜| 一级黄色大片网站| 日本在线一级片| 九九热在线观看视频| 久久亚洲电影天堂| 夜夜爽妓女8888视频免费观看| 国产尤物久久久| 久久久国产精品人人片| www.色呦呦| 亚欧美在线观看| 亚洲成av人片一区二区梦乃| 影音先锋中文在线视频| 成人女保姆的销魂服务| 精品国产三级a在线观看| 红桃视频在线观看一区二区| 久久美女精品| 蜜桃在线一区二区| 国产久一一精品| 国产三级做爰高清在线| 国产电影一区| 一本一道久久a久久精品逆3p| 日韩av成人在线| 亚洲一区二区自拍偷拍| 性xxxx搡xxxxx搡欧美| xxxx欧美18另类的高清| 丝袜亚洲精品中文字幕一区| 欧美裸身视频免费观看| 日韩精品永久网址| 毛片一区二区三区| 久久99久久| 成人久久18免费网站麻豆| 亚洲国产日韩欧美在线动漫| 黄色片免费大全| www成人免费观看网站| 亚洲永久精品视频| 在线看片日韩| 国产精品白丝喷水在线观看| 性感美女福利视频| 一本色道久久综合亚洲精品图片| 日韩视频一区| 国产亚洲一区二区在线| av免费在线播放网站| 久久精品成人欧美大片| 欧美一区二区三区免费观看视频| 亚洲精品你懂的| 同性视频网站免费男| 日韩av电影免费观看| 国产一区二区久久| 欧美人妇做爰xxxⅹ性高电影| 国产亚洲欧美日韩美女| 日韩一区网站| 国产永久av在线| 一区二区三区动漫| 久久精品女人毛片国产| 亚洲精品在线看| 久久精品动漫| 日本欧美一区二区在线观看| 亚洲成人自拍偷拍| 欧美日韩午夜激情| 一本色道久久综合亚洲aⅴ蜜桃| 精品亚洲乱码一区二区| 免费视频成人| 成人激情免费网站| 色综合天天综合狠狠| 日韩精品色哟哟| 天天av综合| 一级在线免费观看| 久久91麻豆精品一区| 性感美女福利视频| 中文字幕av一区二区三区| 精品国产一区二区精华| 国产精品ⅴa在线观看h| 免费成人在线观看视频| 国产精品日韩欧美一区| 日韩av免费在线观看|