[英]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);
}
其中Base
是Base
(我認為)被明確替換為Base
而Derived
被推斷為Derived
。
重申一下,即使我們指定了Base
的模板參數,它如何編譯?
事實上,它不是“非專業化”而是“非參數化”,由於語言特性,這實際上是可以的。 這種機制稱為class 名稱注入,由標准指定。
就像@康桓瑋提到的那樣,可以在沒有 class 聲明中的模板 arguments 的情況下使用Base
。
有關一些背景,請參見例如
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.