Re: Compile-time polymorphism of "interfaces"
Thanks guys for your responses. I am going to look into CRTP and the
adapter pattern. I think I didn't explain myself clearly. Let me try
again.
We have "Port" and "Protocol" classes. We want to re-use the complex
protocol logic on different hardware. To do this, the Protocol has to
be able to call the Port to do a send, and the Port has to be able to
call the Protocol to do a receive. So both of them have to have a
binary interface to the other. We used "interfaces" (pure virtual
functions in base classes) to binary interfaces, but we seem to have a
performance hit.
I think all the information is actually available at compile time...
but I seem to get circular definitions when I try to make templates.
So what we have is sort of like this:
class Protocol{public: virtual void Receive(BYTE* pbMsg, int iLen)
= 0;};
class Port{public: virtual void Send(BYTE* pbMsg, int iLen) =
0;};
class ActualProtocol : public Protocol
{
Port* m_pPort;
public: virtual void Receive(BYTE* pbMsg, int iLen) {
//just send it back (dummy)
m_pPort->Send(pbMsg, iLen);
}
};
class ActualPort : public Port
{
Protocol* m_pProtocol
public: virtual void Send(BYTE* pbMsg, int iLen){//physically
write it out }
void Interrupt() {
BYTE BytesExtracted[1024];
int iNumExtracted = 0;
//extract bytes from hardware....
m_pProtocol->Receive(BytesExtracted, iNumExtracted);
}
};
When I try to think of these as templates I seem to get circular
definitions such as:
template<typename Port>
class Protocol {
Port& m_rPort;
public:
Protocol(Port& rPort):m_rPort(rPort){}
void Receive(BYTE* pbMsg, int iLen) {
m_rPort.Send(pbMsg, iLen);
}
};
template<typename Protocol>
class Port {
Protocol& m_rProtocol;
public:
Port(Protocol& rProtocol):m_rProtocol(rProtocol){}
void Interrupt() {
BYTE BytesExtracted[1024];
int iNumExtracted = 0;
//extract bytes from hardware....
m_rProtocol.Receive(BytesExtracted,
iNumExtracted);
}
void Send(BYTE* pbMsg, int iMsgLen){//physically
write it out }
};
Now if you try to instantiate these, each in terms of the other....
well, I'm not sure how to do that.
Any suggestions?
Thanks
Andy
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]