gpt4 book ai didi

c++ - 使用指针或引用时的模板特化优先级

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:35:59 26 4
gpt4 key购买 nike

我有一个像这样的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com