...世界上最受推崇且設計精良的 C++ 函式庫專案之一。
— Herb Sutter 與 Andrei Alexandrescu,《C++ Coding Standards》
版權所有 © 2004, 2005 Arkadiy Vertleyb, Peder Holt
依據 Boost 軟體授權條款 1.0 版散布。(請參閱隨附檔案 LICENSE_1_0.txt 或複製於 https://boost.dev.org.tw/LICENSE_1_0.txt)
目錄
現今許多樣板函式庫提供物件產生器,利用 C++ 樣板引數推導功能簡化物件建立。以 std::pair
為例。為了實例化這個類別樣板並建立此實例化的臨時物件,必須提供樣板參數以及建構函式的參數
std::pair<int, double>(5, 3.14159);
為了避免這種重複,STL 提供了 std::make_pair
物件產生器。使用它時,樣板參數的類型會從提供的函式引數推導出來
std::make_pair(5, 3.14159);
對於臨時物件來說,這樣就足夠了。然而,當需要配置具名物件時,問題又再次出現
std::pair<int, double> p(5, 3.14159);
物件產生器不再有幫助
std::pair<int, double> p = std::make_pair(5, 3.14159);
如果能從初始化表達式(右側)推導出物件(左側)的類型就好了,但目前的 C++ 語法不允許這樣做。
上面的例子展示了問題的本質,但沒有展示其規模。許多函式庫,尤其是表達式樣板函式庫,會建立非常複雜類型的物件,並竭盡全力將這種複雜性隱藏在物件產生器後面。考慮一個 Boost.Lambda 函子
_1 > 15 && _2 < 20
如果想要配置這樣一個看似無害的函子的具名副本,就必須指定如下內容
lambda_functor< lambda_functor_base< logical_action<and_action>, tuple< lambda_functor< lambda_functor_base< relational_action<greater_action>, tuple< lambda_functor<placeholder<1> >, int const > > >, lambda_functor< lambda_functor_base< relational_action<less_action>, tuple< lambda_functor<placeholder<2> >, int const > > > > > > f = _1 > 15 && _2 < 20;
不太優雅。為了解決這個問題(以及其他一些問題),C++ 標準委員會正在考慮對標準語言進行一些補充,例如 typeof/decltype
和 auto
(請參閱 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1607.pdf)。
typeof
運算子(或 decltype
,它是 typeof
的一個略微不同的變種)允許人們在編譯時期決定一個表達式的型別。使用 typeof
,上面的例子可以大幅簡化。
typeof(_1 > 15 && _2 < 20) f = _1 > 15 && _2 < 20;
好多了,但仍然存在一些重複。 auto
型別解決了剩下的問題。
auto f = _1 > 15 && _2 < 20;
Boost.Typeof 函式庫的目的是提供一個基於函式庫的解決方案,在基於語言的機制被添加到標準中並廣泛使用之前,可以使用它。