c++模板解疑??

3 views
Skip to first unread message

lincoln

unread,
Jun 5, 2009, 1:28:48 AM6/5/09
to dev4s...@googlegroups.com
虽然这不是网络相关的问题,仅是个c++ 模板写的一个迭代器。但一直不明白里面的一个实现细节,知道这个组里的犀牛多,,帮我解惑下吧

//迭代器
template< typename T, typename F >
void ForEach( T& t, F f )
{
for( typename T::iterator it = t.begin(); it != t.end(); ++it )
( (*it)->*f )();
}

//测试类
class example
{
public:
void print()
{
///do something here
}
};

void main()
{
std::list<example*> example_list;
for(int i=0; i<10; i++)
{
example* pElement = new example();
example_list.push_back( pElement );
}

ForEach(&example_list, &example::print); //????
}

ForEach 使用的第二个参数不明白什么意思
//??? &example::print ?表示成员函数指针的指针,但这里没有实例,哪有指针啊??
除非 print 是个静态成员函数
--

Sent from Fuzhou, 35, China

fly

unread,
Jun 5, 2009, 3:19:35 AM6/5/09
to dev4s...@googlegroups.com
这程序能跑通吗?

2009/6/5 lincoln <linc...@gmail.com>

lincoln

unread,
Jun 5, 2009, 3:29:05 AM6/5/09
to dev4s...@googlegroups.com
修改为 ForEach(example_list, &example::print);

这样可以,实参一 example_list 不要加取地址符 &

笔误

2009/6/5 fly <kik107...@gmail.com>:

SpitFire

unread,
Jun 5, 2009, 3:33:35 AM6/5/09
to dev4s...@googlegroups.com
&example::print是取成员相对地址,不只是函数,成员变量也是可以的,你可以查阅一下c++的语法书,比如TCPL

2009/6/5 lincoln <linc...@gmail.com>



--
SpitFire

lincoln

unread,
Jun 5, 2009, 3:44:40 AM6/5/09
to dev4s...@googlegroups.com
另个问题 &example::print 修改为 example::print 程序也可以正常运行
c 规定函数名本身也是指针,和数组名一样。
那再加上取地址符不是 指向函数指针的指针
但现在看来 &example::print example::print 貌视是等价的

2009/6/5 SpitFire <spit...@gmail.com>:

shiwei xu

unread,
Jun 5, 2009, 6:15:57 AM6/5/09
to dev4s...@googlegroups.com
typename F 被约束为 void (example::*)() 类型,这是一个成员函数指针类型。样例:
 
void (example::*func)();
 
func = &example::print;
 
example* o = new example;
o->*func();
 
完毕。

2009/6/5 lincoln <linc...@gmail.com>

ryu...@gmail.com

unread,
Jun 5, 2009, 8:16:51 AM6/5/09
to 高性能网络编程邮件列表

On 6月5日, 下午3时44分, lincoln <lincol...@gmail.com> wrote:
> 另个问题 &example::print 修改为 example::print 程序也可以正常运行
> c 规定函数名本身也是指针,和数组名一样。
> 那再加上取地址符不是 指向函数指针的指针
> 但现在看来 &example::print example::print 貌视是等价的

哈哈,不错,的确如此,你得到它了
而且,如果有:

typedef void(*FuncType)();
FuncType func_type = func1();

你也可以直接
func_type();
而不需要
*func_type();

>
> 2009/6/5 SpitFire <spitfi...@gmail.com>:


>
>
>
> > &example::print是取成员相对地址,不只是函数,成员变量也是可以的,你可以查阅一下c++的语法书,比如TCPL
>

> > 2009/6/5 lincoln <lincol...@gmail.com>


>
> >> 修改为 ForEach(example_list, &example::print);
>
> >> 这样可以,实参一 example_list 不要加取地址符 &
>
> >> 笔误
>

> >> 2009/6/5 fly <kik107732...@gmail.com>:
> >> > 这程序能跑通吗?
>
> >> > 2009/6/5 lincoln <lincol...@gmail.com>

ryu...@gmail.com

unread,
Jun 5, 2009, 8:21:57 AM6/5/09
to 高性能网络编程邮件列表

"除非 print 是个静态成员函数"------错!

看起来,你并不是很明白,c++对于成员函数的实现。

假如:

class A{
public:
void gogogo(int i) { cout << i << endl; }
};
A a;
a.gogogo();

那么,实际在C++实现时,是类似于这样:

void gogogo(class A, int i) { cout << i << endl; }
A a;
gogogo(a);

所以,gogogo这样的成员函数,也当然有它的地址。

但是!
typedef void(*FuncType)(int);
FuncType = &A::gogogo;
是不正确的!

因为,gogogo函数,实际上还有一个参数;

老犁

unread,
Jun 5, 2009, 1:00:35 PM6/5/09
to dev4s...@googlegroups.com

UnaryFunction for_each(InputIterator first, InputIterator last, UnaryFunction f);

这个是stl的for_each原型。

UnaryFunction f
这个是一个function name。

也就是说调用for_each的时候,你可以重载你类中的()操作符,这样调用起来大概是这样
for_each( first, last, myclass() );


ryu...@gmail.com

unread,
Jun 5, 2009, 9:01:43 PM6/5/09
to 高性能网络编程邮件列表
老犁说得不错,不过有一个小问题:

"
UnaryFunction f
这个是一个function name。
"

这不是function name, 而是functor name.

lincoln

unread,
Jun 5, 2009, 9:39:03 PM6/5/09
to dev4s...@googlegroups.com
通过个讨论加深了,对类函数指针的认识,下面是在csdn上找到的一段话
class simple{
public:
int a;
int fn(int x);
};

定义一个指向成员a的指针

int simple::* pa = &simple::a;
//因为引用的不是一个具体的对象.所以pa并没有一个确切的地址.而是一个对象内相对的一个地址.


定义一个指向成员函数的指针

int (simple:: *pfn) (int) = simple::fn;

使用这些指针时.
对象.*指针 或
p -> *指针


依葫芦画瓢写了个调用类函数的模板

template< typename T, typename F,typename V >
void DoMethod(T& t, F f, V v)
{
(t.*f)(v);
}

2009/6/6 ryu...@gmail.com <ryu...@gmail.com>:

fly

unread,
Jun 16, 2009, 9:01:25 PM6/16/09
to dev4s...@googlegroups.com
获益。。

sunway

unread,
Jun 17, 2009, 7:40:09 AM6/17/09
to 高性能网络编程邮件列表
这个是对象函数指针。需要8个字节,32位机器上

On 6月5日, 下午3时19分, fly <kik107732...@gmail.com> wrote:
> 这程序能跑通吗?
>
> 2009/6/5 lincoln <lincol...@gmail.com>

> > Sent from Fuzhou, 35, China- 隐藏被引用文字 -
>
> - 显示引用的文字 -

Reply all
Reply to author
Forward
0 new messages