喜歡這篇文章嗎?喜歡的話去看博主的置頂部落格,即可依據分類找到此文章的原版得到更好的體驗,
title: boost 原始碼分析筆記8 - any
mathjax: true
date: 2020-03-17 16:55:58
categories: [c++筆記,boost原始碼分析筆記]
tags: [c++筆記,boost原始碼分析筆記]
keywords: [c++筆記,boost原始碼分析筆記]
如所示,any能夠支援我們的c++向python一樣,給乙個變數瞎賦值,這也太爽了。
template
<
typename valuetype>
any(
const valuetype & value)
:content
(new holder<
boost_deduced_typename remove_cvconst valuetype>
::type>
::type
>
(value)
)
這裡是接受任意的型別,然後對這個型別使用decay得到他的基本型別,最後讓holder來替我們管理。holder保持了乙個輸入引數的副本,我們發現這個holder型別的值放到了乙個叫content的指標中。
holder繼承自placeholder,placeholder是乙個介面,我們不去管他,holder內部的副本儲存在held中。
template
<
typename valuetype>
class
holder
#ifndef boost_no_cxx11_final
final
#endif
:public placeholder
#ifndef boost_no_cxx11_rvalue_references
holder
(valuetype&& value)
:held
(static_cast
< valuetype&&
>
(value)
)#endif
public
:// queries
virtual
const boost::typeindex::type_info&
type()
const boost_noexcept
virtual placeholder *
clone()
const
public
:// representation
valuetype held;
private
:// intentionally left unimplemented
holder &
operator=(
const holder &);
};
any資料有兩種讀取方式,一是指標,想要讀取出裡面的元素,顯然元素是operand->content->held, 我們要得到他的指標的話,先構造出指標來: holder::type>*, 因為operand->content是placeholer,這也就是為什麼下面的**的括號在->held之前的原因。最後用boost::addressof取出位址就可以了。
template
<
typename valuetype>
valuetype *
any_cast
(any * operand) boost_noexcept
第二種方式是讀取拷貝,先移除引用,呼叫上面的指標讀取,最後指標取內容就可以返回了。
template
<
typename valuetype>
valuetype any_cast
(any & operand)
前兩個就不說了,直接說第三個,如果content存在,就呼叫content的type
bool
empty()
const boost_noexcept
void
clear
() boost_noexcept
const boost::typeindex::type_info&
type()
const boost_noexcept
type是這樣實現的
virtual
const boost::typeindex::type_info&
type()
const boost_noexcept
Boost 原始碼分析筆記1 remove cv
remove cv 這個模版類能夠幫我們去掉型別的const,他的實現很簡單,即使用模版元技術 template class t struct remove cv template class t struct remove cv template class t struct remove cv ...
Boost 原始碼分析筆記2 is array
喜歡這篇文章嗎?喜歡的話去看博主的置頂部落格,即可依據分類找到此文章的原版得到更好的體驗,title boost 原始碼分析筆記2 is array mathjax true date 2020 03 17 15 19 27 categories c 筆記,boost原始碼分析筆記 tags c 筆...
boost 原始碼 ref 庫分析
引用檔案 boost ref.hpp 一般情況下,泛型演算法中的函式物件,傳值語義是可行的,但是也有很多特殊情況,作為引數的函式物件拷貝代價過高 具有複雜的內部狀態 或者不希望拷貝物件 內部狀態不應該被改變 甚至拷貝是不可行的 noncopyable,單件 boost.ref應用 模式,引入物件引用...