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

标签 c++ inheritance template-specialization

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

相关文章:

c++ - C 和 C++ 之间的缓冲区相同方法中的文件读取?

c++ - C/C++ 条件返回语句

java - 当我可以通过引用子类访问所有方法时,为什么还要引用基类?

Java:如何创建同步块(synchronized block)以及子类使用的同步块(synchronized block)

python - 使具体类抽象,保留构造函数

c++ - 模板替换在调试构建中失败,但在优化构建中工作?

c++ - 如何使#include-file 的内容成为 cpp 文件中的编译时常量?

c++ - 隐式类实例化翻译单元 : multiple definition when linking

c++ - Lint (CLang) 对 'override' 的特化投诉

使用模板定义多个函数的 C++ 通用方法