簡體   English   中英

Boost 序列化 base_object 非專業模板 - 為什么它有效?

[英]Boost serialization base_object unspecialized template - why does it work?

我試圖理解為什么這個最小的例子可以編譯:

https://godbolt.org/z/xYeo53GPv

template <typename T>
struct Base {
    friend class boost::serialization::access;
    template <class ARCHIVE>
    void serialize(ARCHIVE& ar, const unsigned int /*version*/) {}
};

struct Derived : public Base<int> {
    friend class boost::serialization::access;
    template <class ARCHIVE>
    void serialize(ARCHIVE& ar, const unsigned int /*version*/) {
        ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Base);
    }
};

由於Base是模板類型,如何在不指定模板參數的情況下將其傳遞給BOOST_SERIALIZATION_BASE_OBJECT_NVP(Base)

作為參考,在 Boost 1.77 中,宏擴展為

#define BOOST_SERIALIZATION_BASE_OBJECT_NVP(name)           \
    boost::serialization::make_nvp(                         \
        BOOST_PP_STRINGIZE(name),                           \
        boost::serialization::base_object<name >(*this)     \
    )

並且boost::serialization::base_object被定義:

template<class Base, class Derived>
typename detail::base_cast<Base, Derived>::type &
base_object(Derived &d)
{
    BOOST_STATIC_ASSERT(( is_base_and_derived<Base,Derived>::value));
    BOOST_STATIC_ASSERT(! is_pointer<Derived>::value);
    typedef typename detail::base_cast<Base, Derived>::type type;
    detail::base_register<type, Derived>::invoke();
    return access::cast_reference<type, Derived>(d);
}

其中BaseBase (我認為)被明確替換為BaseDerived被推斷為Derived

重申一下,即使我們指定了Base的模板參數,它如何編譯?

事實上,它不是“非專業化”而是“非參數化”,由於語言特性,這實際上是可以的。 這種機制稱為class 名稱注入,由標准指定。

就像@康桓瑋提到的那樣,可以在沒有 class 聲明中的模板 arguments 的情況下使用Base

有關一些背景,請參見例如

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM