这对我来说没有任何意义。海湾合作委员会抱怨说,main()
到processMsg()
以下的呼叫是不明确的,即使所有模板创建的processMsg()
调用都被报告为候选者。我尝试过使用三种不同的方式来实现这个可变参数模板原型,并且他们都回到了模糊请求的相同问题。当我将模板实现分解为不同的情况时,我确实靠得更近,但是然后编译器只能解析元组中的第一个查找。来自可变数据模板的恶意成员请求
我贴了一个小例子。我敢肯定,我失去了一些东西简单....
#include <tuple>
//----------------------------------------------------------------------
//
class MessageBase
{
public:
MessageBase(const int _id) : m_id(_id) {}
virtual int getMessageID() const { return(m_id); }
private:
const int m_id;
};
#define MESSAGE(NAME, VAL) \
class Message##NAME : public MessageBase { \
public: \
Message##NAME() : MessageBase(VAL) { } \
};
MESSAGE(One, 1);
MESSAGE(Two, 2);
MESSAGE(Ten, 10);
//----------------------------------------------------------------------
//
template< typename T >
struct MyMessageInterface {
virtual void processMsg(const T& t) { }
};
template< typename... T >
struct MyMessageHandler : public MyMessageInterface<T>...
{};
template< typename... T >
struct MyMessageHandler< std::tuple<T...> >
: public MyMessageInterface<T>...
{};
//----------------------------------------------------------------------
//
typedef std::tuple< MessageOne, MessageTwo, MessageTen > Foople;
int main()
{
MyMessageHandler<Foople> mmh;
mmh.processMsg(MessageOne());
}
嗯......所以这个计划是(下一步)从上面派生一个具体的MessageHandler对象,并在派生类中重载processMsg()调用。我猜这是行不通的? (我试过了,看起来好像没有。) – RMHarris157
@ RMHarris157我们公司代码库中使用的一个选项是调用虚函数'v_processMsg',它可以在稍后被覆盖,并具有非虚拟的'processMsg '转发给它。这样,接口/转发器'processMsg'可以放在正确的位置,不会影响虚拟部分和类层次结构。 –
因此,在上面的上下文中,我将MyMessageInterface更改为:'virtual void vProcessMsg(const MessageT&)= 0;'并将转发器中的调用更改为'MyMessageInterface < MessageT > :: vProcessMsg(_msg);'当我尝试为了编译包含上述派生定义的.C,连接器抱怨它无法为元组中的每个类找到vProcessMsg的基类实现。我在某个地方错过了另一个间接层? – RMHarris157