次のような Serializer クラスがあります。
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 2 で処理したい場合でも、常に Func 1 で処理されることです (ポインターまたは参照はどちらも同じように動作します)。次のように明確に指定しない限り、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>
、プログラムはバグアウトします。これはかなり面倒です。
これを回避する方法はありますか?