2012-07-05 49 views
2

这里有很好的描述了如何通过指针调用成员函数: http://www.newty.de/fpt/functor.html是否有可能在C++中将指针类成员作为单个参数传递?

但仿函数需要获得2个参数:指针到对象,指针到成员函数:

TSpecificFunctor(TClass* _pt2Object, void(TClass::*_fpt)(const char*)) 
{ pt2Object = _pt2Object; fpt=_fpt; } 

拨打:

(*pt2Object.*fpt)(string); 

是否有可能通过一个参数,如C-风格:

func() -- call 
func -- function pointer 

为什么obj.method不是完整的指针类成员?

+0

您能否澄清一下声明“为什么obj.method不是完整的指针类-会员?”这是什么意思? – Naveen 2012-07-05 09:04:20

+0

'(* pt2Object。* fpt)(string);'不起作用。你需要'(pt2Object - > * fpt)(string);'。 – Potatoswatter 2012-07-05 09:06:28

+0

Naveen,我想获得指向特定对象(obj)和特定类成员(成员)的单个参数。但似乎我开始明白......多态性并没有给我潜力做我想做的事。 – legotron 2012-07-05 09:11:23

回答

7

语法object.*ptmf不创建一个中间对象。它没有意义,并被语言禁止。你立即调用访问成员函数指针的结果。

您可以使用std::bind明确地创建这样一个对象,该对象将ptmf解释为函子对象,并使隐式this参数显式化。

auto fn = std::bind(ptmf, object, std::placeholders::_1); 
std::function< void(const char *) > stdfn = fn; 
fn("foo"); // equivalent to object.*ptmf("foo"); 

http://ideone.com/ds24F

注意,此功能是在C++ 11新。尽管C++ 03 TR1具有functionbind,但它们不会在ptmf上执行此转换。 (Plain C++ 03可以使用std::mem_fnstd::bind1st来完成这项工作,但它们使用起来非常痛苦并且已被弃用。)

+0

如果我正确地理解了这个问题,他想通过作为参数的函数,因此您需要指定类型 - 不使用已更新的auto – 2012-07-05 09:20:09

+0

@BЈовић; v)。请注意,没有办法明确指定'std :: bind'的返回类型,'std :: function'可能会添加一个间接调用,所以'auto'是最好的选择,除非您需要将它存储在本地范围之外或传递给非模板函数。 – Potatoswatter 2012-07-05 09:20:30

+0

@SteveJessop同样,已经更新:)只是刷新页面 – Potatoswatter 2012-07-05 09:33:39

1

是否有可能将指针类成员作为C++中的单个参数传递?

不,这是不可能的。你需要你想调用该方法的类的对象。

你可以去解决这个使用lambda functions,就像下面的例子:

#include <iostream> 
#include <functional> 

void call(const std::function< void(const char * a) > & fn) 
{ 
    fn("hi"); 
} 

void foo(const char * a) 
{ 
    std::cout << "foo : " << a << std::endl; 
} 

class bar 
{ 
public: 
    void operator()(const char * a) 
    { 
    std::cout << "bar : " << a << std::endl; 
    } 
}; 

int main() 
{ 
    bar b; 
    const auto f1 = [&](const char * a){ b(a); }; 

    const auto f2 = foo; 

    call(f1); 
    call(f2); 
} 
1

问自己是否可以调用成员方法,而无需指定的对象。 考虑一下:

class A { 
public: void m() {} 
}; 
int main() { 
    m(); // can't call without object - like: A a; a.m(); 
} 
+0

我写了错误的评论,并删除它,对不起。 A.m是精神错乱:)如果你创建一个对象,一个obj,为什么obj.m不是一个正确的指向成员的指针? – legotron 2012-07-05 09:27:37

+0

@legotron对于A类中的每个对象,派生的A :: m()只被定义一次。它相当于“C”函数'A_m(A * const this)'。类似的问题:有函数'int f(int i);'你会期望有有效地址给'&f(1)'?你只能把'pf =&f'作为'(* pf)(1)'使用它 - 你不能说'pf = &f(1);(* pf)()' – PiotrNycz 2012-07-05 12:02:59

相关问题