通过继承专门化操作符模板

Specialize operator template via inheritance

本文关键字:操作符 专门化 继承      更新时间:2023-10-16

创建Boost的自定义轻量级适配。到目前为止,我尝试了一些东西。让下面的存根被给定:

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

一般来说,几乎所有的数据类型都可以通过调用全局Serialize函数来正确处理,但是也有一些例外。对于某些数据类型,我希望根据指定的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);
}