非类型模板参数问题
template <class Type,typename MemberType,MemberType Type::*Member>
struct member_data :public std::unary_function<Type,ElemType&>
{
inline MemberType& operator()(Type& x){
return x.*Member;
}
};
用法:
struct A{ int a,b;};
member_data<A,int,&A::b> getb;
A object;
getb(object) = 0;//返回b的引用。
有没有办法让memdata所需要的模板参数少一些,像这样:
member_data<&A::b> getb;
如果是函数的话是可以的:
template <class Type,typename MemberType>
MemberType& fun(MemberType Type::*Member){
Type x;
return x.*Member;
};
模板类的话应该怎么做呢?
另外如果是函数参数的话呢?(我知道 std::mem_fun();但是它不能被内联,不适合用来做适配器):
template <class Type,typename Result,Result (Type::*pFun)() >
struct member_fun :public std::unary_function<Type,Result>
{
inline Result operator()(Type& x){
return (x.*pFun)();
};
};
菜鸟表示嵌套好复杂
#include<stdio.h>
#include<functional>
#include<algorithm>
class test
{
int m;
public:
test( int x ):m(x)
{
}
void func()
{
m;
printf("%d\n",m);
}
};
int main()
{
test x[3]={test(1),test(2),test(3)};
std::for_each( x , x + 3 , std::mem_fun_ref(&test::func) );
return 0;
}
PUBLIC_main
; Function compile flags: /Ogtpy
; File c:\documents and settings\hwp\桌面\test.cpp
;COMDAT _main
_TEXTSEGMENT
_x$ = -12; size = 12
_mainPROC; COMDAT
; 22 : {
subesp, 12; 0000000cH
pushesi
; 23 :
; 24 : test x[3]={test(1),test(2),test(3)};
movDWORD PTR _x$[esp+16], 1
movDWORD PTR _x$[esp+20], 2
movDWORD PTR _x$[esp+24], 3
; 25 :
; 26 : std::for_each( x , x + 3 , std::mem_fun_ref(&test::func) );
leaesi, DWORD PTR _x$[esp+16]
$LL15@main:
movecx, esi
call?func@test@@QAEXXZ; test::func
addesi, 4
leaeax, DWORD PTR _x$[esp+28]
cmpesi, eax
jneSHORT $LL15@main
; 27 :
; 28 :
; 29 : return 0;
xoreax, eax
popesi
; 30 : }
addesp, 12; 0000000cH
ret0
_mainENDP
_TEXTENDS
END