//迭代器
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
这样可以,实参一 example_list 不要加取地址符 &
笔误
2009/6/5 fly <kik107...@gmail.com>:
2009/6/5 SpitFire <spit...@gmail.com>:
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>
"除非 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函数,实际上还有一个参数;
UnaryFunction for_each(InputIterator first, InputIterator last, UnaryFunction f);
这个是stl的for_each原型。
UnaryFunction f
这个是一个function name。
也就是说调用for_each的时候,你可以重载你类中的()操作符,这样调用起来大概是这样
for_each( first, last, myclass() );
"
UnaryFunction f
这个是一个function name。
"
这不是function name, 而是functor name.
定义一个指向成员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>:
On 6月5日, 下午3时19分, fly <kik107732...@gmail.com> wrote:
> 这程序能跑通吗?
>
> 2009/6/5 lincoln <lincol...@gmail.com>
> > Sent from Fuzhou, 35, China- 隐藏被引用文字 -
>
> - 显示引用的文字 -