L.SG
L.SG

Reputation: 131

How to make polymorphic and static functions coexist?

Or is there a way to get ResponseState::EncoderTag out of class ResponseState?

The code is shown below

#include <iostream>
#include <memory>
#include <string>

using namespace std;

class MirroredMsgRespState
{
public:
    virtual ~MirroredMsgRespState(){}

    virtual uint32_t encoderTag() const = 0;
};

template<typename RespMsgT, uint32_t EncoderTag>
class ErrorAndEntryResponseState : public MirroredMsgRespState
{
public:
    uint32_t encoderTag() const override
    {
        return EncoderTag;
    }
};

using ResponseState = ErrorAndEntryResponseState<int, 48>;

int main()
{
    unique_ptr<MirroredMsgRespState> myResp = make_unique<ResponseState>();

    cout << myResp->encoderTag() << endl;         // func 1
    cout << ResponseState::encoderTag() << endl;  // func 2

    return 0;
}

The current implementation causes the second call to report an error

Upvotes: 0

Views: 54

Answers (1)

user15388024
user15388024

Reputation:

You could add a static method:

#include <iostream>
#include <memory>
#include <string>

using namespace std;

class MirroredMsgRespState
{
public:
    virtual ~MirroredMsgRespState(){}

    virtual uint32_t encoderTag() const = 0;
};

template<typename RespMsgT, uint32_t EncoderTag>
class ErrorAndEntryResponseState : public MirroredMsgRespState
{
public:
    static uint32_t getEncoderTag()
    {
        return EncoderTag;
    }
    uint32_t encoderTag() const override
    {
        return getEncoderTag();
    }
};

using ResponseState = ErrorAndEntryResponseState<int, 48>;

int main()
{
    unique_ptr<MirroredMsgRespState> myResp = make_unique<ResponseState>();

    cout << myResp->encoderTag() << endl;         // func 1
    cout << ResponseState::getEncoderTag() << endl;  // func 2

    return 0;
}

Upvotes: 2

Related Questions