我希望通过基类指针将参数包完美地转发到包含特定类型方法指针的派生类,然后使用完美转发的参数包调用该方法指针。该类Sender<cARGS>
具有容器std::set<ReceiverBase<cARGS>*>
。我想用相同的参数包值迭代容器(我知道该怎么做)。不同ReceiverBase<cARGS>*
会有不同的派生类( Receiver<cPARENT, cARGS>
)方法指针类型,但是参数包类型会是一样的(派生类中的cPARENT类型就是方法指针类型)。在复制参数包的情况下,我可以按预期工作。现在我希望像这样添加完美的转发:
template<typename ...Ts>
void Notify(Ts&&...args)
{
(m_parent->*m_notifyMethod)(std::forward(args)...);
}
我了解我不能使用虚拟模板方法。我尝试使用双重调度访问者模式,但是当我不知道保存方法指针的类的类型时,我不确定如何执行此操作。
template <typename ...cARGS>
class RecevierBase
{
public:
virtual void Notify(cARGS...) = 0;
};
template <typename cPARENT, typename ...cARGS>
class Recevier : public RecevierBase<cARGS...>
{
typedef void (cPARENT::* NOTIFY_METHOD)(cARGS...);
public:
Recevier(cPARENT *parent, NOTIFY_METHOD notifyMethod) :
m_parent(parent), m_notifyMethod(notifyMethod)
{ }
virtual void Notify(cARGS... args)
{
(m_parent->*m_notifyMethod)(args...);
}
private:
cPARENT *m_parent;
NOTIFY_METHOD m_notifyMethod;
};