我有一个像这样的 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;
};
现在我的问题是,当我有继承可序列化接口(interface)的类时,它们将始终由 Func 1 处理,即使我希望它们由 Func 2 处理(指针或引用无关紧要,它们的行为相同)。似乎 C++ 无法识别 Serializable 接口(interface)是继承的,除非您明确指定:
SerializableClass sc; // Inherits Serializable
InputSerializer s; // Inherits Serializer
s.Serialize(&sc); // Func 1 is called >:(
s.Serialize<Serializable>(&sc); // Func 2 is called
现在一旦我忘记添加 <Serializable>
程序当然会在某个地方出错,这很烦人。
有什么办法解决这个问题吗?
最佳答案
It seems like C++ doesn't recognize that the Serializable interface is inherited unless you clearly specify that
这是真的。如果你有一些课
class SerializableClass : public Serializable
推导T
参数时,只考虑SerializableClass
,不考虑Serializable
。
如果您需要创建两个函数,一个采用任何指针,另一个采用指向从 Serializable 派生的任何内容的指针,您可以创建两个重载并尽可能使用 SFINAE 选择较窄的一个。
template <class T>
typename boost::enable_if_c<!boost::is_base_of<Serializable, T>::value, void>::type foo(T*) { ... }
template <class T>
typename boost::enable_if<boost::is_base_of<Serializable, T>, void>::type foo(T*) { ... }
如果您不想使用 boost,您可以实现类似于 this 的所需功能.
关于c++ - 使用指针或引用时的模板特化优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4389951/