У меня есть класс сериализатора, подобный этому:
class Serializer
{
public:
// Func 1 (default)
template <class T>
void Serialize(T* pValue)
{
SerializeInternal(reinterpret_cast<char*>(pValue), sizeof(*pValue));
}
// Func 2 (specialization)
template <>
void Serialize<Serializable>(Serializable* pSerializable)
{
pSerializable->Serialize(*this);
}
protected:
// Implemented by input and output serializers
virtual void SerializeInternal(char* pData, size_t size) = 0;
};
Теперь моя проблема в том, что когда у меня есть классы, которые наследуют интерфейс Serializable, они всегда будут обрабатываться Func 1, даже если я хочу, чтобы они обрабатывались Func 2 (указатели или ссылки не имеют значения, они оба ведут себя одинаково). Похоже, что C ++ не распознает, что интерфейс Serializable наследуется, если вы явно не укажете, что:
SerializableClass sc; // Inherits Serializable
InputSerializer s; // Inherits Serializer
s.Serialize(&sc); // Func 1 is called >:(
s.Serialize<Serializable>(&sc); // Func 2 is called
Теперь, как только я забуду добавить <Serializable>
куда-нибудь, программа, конечно, выдает ошибку, что довольно раздражает.
Есть ли способ обойти это?