如何解决C ++ 11调用虚拟成员函数
我正在尝试使用C ++ 11实现类似的东西。
df1 <- structure(list(x = c(0.35,0.46,0.6,0.78,1.02,1.34,1.76,2.35,3.17,4.28,5.77,7.79,10.5,14.2,19.1,25.8),y = c(32.4,43,37.2,26.1,17.4,14,19.9,36.9,48.6,55.3,64.6,70.2,63.9,47.6,22.7,10.3)),class = "data.frame",row.names = c(NA,-16L))
class Proto{
public:
virtual void fu() = 0;
};
class Impl: public Proto{
public:
void fu();
};
void Impl::fu(){
LOG_INFO("im fu");
}
class Inv{
public:
void useFu(void (Proto::*)());
};
void Inv::useFu(void (Proto::*fu)()){
//fu();
};
void main(){
Impl impl;
Inv inv;
//inv.useFu(impl.fu);
}
必须以这种方式声明,因为useFu(void (Proto::*)())
使用了特定于fu()
功能的一些
我有两个地方出了问题。
首先是Proto
本身,其次是如何将fu作为参数fu()
传递。
在bipll答案后编辑
inv.useFu(impl.fu)
的建议用法解决了我的问题的第二个问题。
inv.useFu()
但是我仍然需要调用inv.useFu(static_cast<void (Proto::*)(void)>(&Impl::fu));
作为成员函数的指针;
解决方法
useFu
现在的声明方式,应称为
inv.useFu(static_cast<void (Proto::*)(void)>(&Impl::fu));
但是我想那不是您想要的。应该是
template<class F> void useFu(F &&f) { std::invoke(std::forward<F>(f)); }
或者简单地
void useFu(std::function<void()> f) { std::invoke(std::move(f)); }
并称为
useFu([&]{ impl.fu(); });
(而不是使用lambda,您可以在后一个调用中使用std::bind
将方法绑定到对象,但是几乎没有人这样做。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。