c++ - 通过继承专门化运算符模板

标签 c++ templates operator-overloading

为了创建 Boost.Serialization 的自定义和轻量级改编,到目前为止我尝试了一些东西。给出以下 stub :

template<typename Archive>
class BasicStream {
public:
    template<typename Any>
    Archive& operator&(Any& data) {
        return Serialize(*this, data);
    }
};

一般来说,几乎所有的数据类型都可以通过调用全局 Serialize 来正确处理。功能,但也有一些异常(exception)。对于某些数据类型,我想根据指定的 Archive 以不同方式处理它们.我试着写

class OutputStream : public BasicStream<OutputStream> {
public:
    template<>
    OutputStream& operator&(MyExceptionalType& data) {
        // ... do something super special ... //
        return *this;
    }
};

但是我收到错误 IntelliSense: declaration is incompatible with function template "OutputStream &BasicStream<Archive>::operator&(Any &data) [with Archive=OutputStream]" .这种继承通用版本的尝试有什么问题 operator&而是将其专门用于派生类?

最佳答案

你可以这样做:

template<typename Archive>
class BasicStream {
public:
    template<typename Any>
    Archive& operator&(Any& data);
};

// generic implementation
template<typename Archive>
template<typename Any>
Archive& BasicStream<Archive>::operator&(Any& data) {
    return Serialize(*this, data);
}

class OutputStream : public BasicStream<OutputStream> {
};

// Specialize the original template, don't overwrite it
template<>
template<>
OutputStream& BasicStream<OutputStream>::operator&(MyExceptionalType& data) {
    // ... do something super special ... //
    return static_cast<OutputStream&>(*this);
}

关于c++ - 通过继承专门化运算符模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15503854/

相关文章:

templates - Pandoc lua过滤器在文档末尾移动图像标题

c++ - 基于静态成员类型的模板函数特化

c++ - 在 C++17 中重载命名空间和子命名空间中的运算符是不明确的

c++ - 在 C++ 中将矩阵高效分解为方形子矩阵

c++ - 连接问题

c++ - 在 Linux/MacOS 上双击执行 C++ 可执行文件

c++ - 考虑引用和 const 的可变参数函数包装器

c++ - 为 __stdcall 函数指针提供比预期更多的参数

c++ - 在 C++ 中重载运算符时 "const"是什么意思

python - 在 __add__ 运算符中返回相同子类的对象