j'ai une classe sérialiseur comme ceci:priorités de spécialisation de modèle lors de l'utilisation des pointeurs ou des références
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;
};
Maintenant, mon problème est quand j'ai des classes qui héritent de l'interface Serializable ils seront toujours traitées par Func 1, même si Je veux qu'ils soient traités par Func 2 (les pointeurs ou les références n'ont pas d'importance, ils se comportent tous les deux de la même manière). Il semble que C++ ne reconnaît pas que l'interface Serializable est héritée sauf si vous spécifiez clairement que:
SerializableClass sc; // Inherits Serializable
InputSerializer s; // Inherits Serializer
s.Serialize(&sc); // Func 1 is called >:(
s.Serialize<Serializable>(&sc); // Func 2 is called
Maintenant, dès que j'oublie d'ajouter <Serializable>
quelque part le programme de bugs de cours sur, ce qui est assez gênant.
Y a-t-il un moyen de contourner ce problème?
Cela semble être une question très similaire: http://stackoverflow.com/questions/4371699/mixing-template- fonction-overloading-and-heritage – UncleBens
Vérifié dehors et oui c'est en effet la même chose. Et là, la fonctionnalité Boost était à nouveau la solution. Je suppose que je dois accepter qu'il n'y a pas de solution C++ pure à cela (il y avait une bonne explication à pourquoi cela ne fonctionnerait pas dans ce fil aussi bien). – DaedalusAlpha
La solution boost ne doit contenir rien qui ne soit pas pur C++. En C++ 0x, 'type_traits' et' enable_if' font partie de la bibliothèque standard. Ce dernier est trivial pour écrire vous-même, 'is_base_of' pourrait être plus compliqué. – UncleBens