非类型模板参数问题
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)();
};
};
[解决办法]
struct A{ int a,b;};
member_data<A,int,&A::b> getb;
A object;
getb(object) = 0;//返回b的引用。
有没有办法让memdata所需要的模板参数少一些,像这样:
member_data<&A::b> getb;
===========
没有办法的,看看模版中文那本书中模版演绎部分
[解决办法]
貌似不行吧,呵呵,想法不错,思考很深入。
[解决办法]
这么变态,心里有阴影。
[解决办法]
我觉得木有办法...
[解决办法]
额 模板参数的演绎只对模板函数不对模板类。这就意味着对模板类的模板参数来说你必须在实例化的时候显示给出。
[解决办法]
看不懂, 帮忙顶贴
[解决办法]
mem_fun应该会内联的
release下试试看。
[解决办法]
不清楚,看看别人知道不
[解决办法]
菜鸟表示嵌套好复杂
[解决办法]
如果你想给class Type,typename MemberType默认实参 那么后面那个非类型模板参数也得用默认实参,而且你在member_data<&A::b> getb;这样使用时意味着这个非类型模板参数得放在2个模板参数前面,但是你知道MemberType Type::*Member有2个东西会提示没有声明
[解决办法]
你搞错了吧。
#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;
}
编译选项
cl file.cpp /O2 /FAs
输出汇编代码
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
只有 call?func@test@@QAEXXZ; test::func
[解决办法]
了解了,木有其他办法了。
[解决办法]