2015-12-30 32 views
1

我有一个棘手的语法错误,我找不出来。我想运行一个函数委托,其中上下文是一个指向对象的指针。语法错误:使用指向对象的指针调用成员函数指针

语法错误:

((object)->*(ptrToMember)) // the compiler doesn't like the ->* 

Where object is of the type Component*

And ptrToMember is of the type void (Component::*EventCallback)()

下面是一个语法错误代码:

typedef void (Component::*EventCallback)(); 

... 

std::weak_ptr<Component> wc(mySharedPtr); 
EventCallback ec = &Component::run; 

((wc.lock())->*(ec))(); // syntax error 
(wc.lock()->(*ec))(); // simpler version but still syntax error 

// This is ok, but is there any significant time or memory involved in this reference object creation? 
Component& wcc = *wc.lock(); 
(wcc.*ec)(); 
+0

太懒了搜索这个的副本所以在这里'(object - > * ptrToMember)()' –

+0

哇,这么多冗余括号! –

回答

1

wc.lock()返回std::shared_ptr<Component>但你希望它返回一个原始Component*指针来代替。您无法拨打std::shared_ptr本身的->*。你要问它的Component*指针它持有,然后你可以使用->*操作上的指针,例如:

(wc.lock().get()->*ec)(); 

既然你正在处理一个std::weak_ptr,你使用它之前可能到期,

if (auto sptr = wc.lock()) { 
    (sptr.get()->*ec)(); 
} 
else { 
    // wc had expired 
} 
0

wc.lock()结果是shared_ptr:你尝试之前访问它,你应该确保Component对象锁定后实际可用。这是智能指针与哑指针分开的少数情况之一。 shared_ptr没有实现operator ->*,所以你的第一个语法不能工作。 (这不是语法错误,你只是想做点什么shared_ptr不支持。)

你已经找到了解决方法。