Boost 原始碼分析筆記8 any

2021-10-04 03:45:12 字數 2418 閱讀 9881

喜歡這篇文章嗎?喜歡的話去看博主的置頂部落格,即可依據分類找到此文章的原版得到更好的體驗,

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應用 模式,引入物件引用...