我希望通过基类指针完美地转发参数包,该指针指向包含特定类型的方法指针的派生类,然后使用完美转发的参数包调用该方法指针。 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;
};