create_delegate(&object, &member_function) create_delegate(&function)
class A
{
int i;
public:
A(int k):i(k) {}
auto get()const ->int { return i;}
auto set(int v)->void { i = v;}
auto inc(int g)->int& { i+=g; return i;}
auto incp(int& g)->int& { g+=i; return g;}
auto f5 (int a1, int a2, int a3, int a4, int a5)const ->int
{
return i+a1+a2+a3+a4+a5;
}
auto set_sum4(int &k, int a1, int a2, int a3, int a4)->void
{
i+=a1+a2+a3+a4;
k = i;
}
auto f8 (int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8) const ->int
{
return i+a1+a2+a3+a4+a5+a6+a7+a8;
}
static auto sqr(double x)->double { return x*x; }
};
A a(11);
auto set1 = create_delegate(&a,&A::set); auto inc = create_delegate(&a,&A::inc); std::function<int(int&)> incp = create_delegate(&a,&A::incp); auto af5 = create_delegate(&a,&A::f5); auto set_sum4= create_delegate(&a,&A::set_sum4); auto af8 = create_delegate(&a,&A::f8); auto sqr = create_delegate(&A::sqr); // static function </int(int&)> set1(25); int x = 5; int k = inc(x); k = incp(x); std::cout << "a.get():" << a.get() << std::endl; std::cout << "k: " << k << std::endl; std::cout << "x: " << x << std::endl; std::cout << "af5(1,2,3,4,5): " << af5(1,2,3,4,5) << std::endl; set_sum4(x,1,2,3,20); std::cout << "after set_sum4(x,1,2,3,20)" << std::endl; std::cout << "a.get(): " << a.get() << std::endl; std::cout << "x: " << x << std::endl; std::cout << "af8(1,2,3,4,5,6,7,8): " << af8(1,2,3,4,5,6,7,8) << std::endl; std::cout << "sqr(2.1): " << sqr(2.1) << std::endl;
a.get():30 k: 35 x: 35 af5(1,2,3,4,5): 45 after set_sum4(x,1,2,3,20) a.get(): 56 x: 56 af8(1,2,3,4,5,6,7,8): 92 sqr(2.1): 4.41
template <class T, class R, class ... P>
struct _mem_delegate
{
T* m_t;
R (T::*m_f)(P ...);
_mem_delegate(T* t, R (T::*f)(P ...) ):m_t(t),m_f(f) {}
R operator()(P ... p)
{
return (m_t->*m_f)(p ...);
}
};
template <class T, class R, class ... P>
_mem_delegate<T,R,P ...> create_delegate(T* t, R (T::*f)(P ...))
{
_mem_delegate<T,R,P ...> d(t,f);
return d;
}
template <class F>
F* create_delegate(F* f)
{
return f;
}
#define _MEM_DELEGATES(_Q,_NAME)\
template <class T, class R, class ... P>\
struct _mem_delegate ## _NAME\
{\
T* m_t;\
R (T::*m_f)(P ...) _Q;\
_mem_delegate ## _NAME(T* t, R (T::*f)(P ...) _Q):m_t(t),m_f(f) {}\
R operator()(P ... p) _Q\
{\
return (m_t->*m_f)(p ...);\
}\
};\
\
template <class T, class R, class ... P>\
_mem_delegate ## _NAME<T,R,P ...> create_delegate(T* t, R (T::*f)(P ...) _Q)\
{\
_mem_delegate ##_NAME<T,R,P ...> d(t,f);\
return d;\
}
_MEM_DELEGATES(,Z)
_MEM_DELEGATES(const,X)
_MEM_DELEGATES(volatile,Y)
_MEM_DELEGATES(const volatile,W)
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有