首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

非类型模板参数有关问题

2013-10-29 
非类型模板参数问题template class Type,typename MemberType,MemberType Type::*Member struct member_

非类型模板参数问题



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个东西会提示没有声明
[解决办法]
引用:
引用:
mem_fun应该会内联的
release下试试看。
还是不会,因为听说他拒绝给指针变量内联。。。虽然他知道这是个常数。。。

你搞错了吧。

#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
[解决办法]
引用:
引用:


只有 call ?func@test@@QAEXXZ ; test::func


我的意思是,test::func都不应该有:
C/C++ code


int main()
{
    test x[3]={test(1),test(2),test(3)};
    std::for_each( x , x + 3 , std::m……


了解了,木有其他办法了。
[解决办法]

用lambda吧,刚才试了一下VC10 G++4.5都能内联
std::for_each( x , x + 3 , [](test& x){ x.func() ; } );

[解决办法]
那不就是抄抄boost::bind的源码么。
[解决办法]
楼主问什么不用 std::bind 或者 boost::bind ?
[解决办法]
引用:
typedef [](test& x){ x.func() ; } myfun;
myfun(x);

这个貌似不能typedef的。
[解决办法]
引用:
引用:

typedef [](test&amp; x){ x.func() ; } myfun;
myfun(x);

这个貌似不能typedef的。

再套一层 decltype 差不多就可以 typedef 了
[解决办法]
引用:
引用:
那不就是抄抄boost::bind的源码么。


还不会用安装boost....能贴下源码吗?

www.boost.org
[解决办法]
引用:
引用:

引用:

typedef [](test&amp;amp; x){ x.func() ; } myfun;
myfun(x);

这个貌似不能typedef的。

再套一层 decltype 差不多就可以 typedef 了

再套的话 恐怕不能inline了

热点排行