Boost C++ 函式庫

...世界上最受推崇且設計精良的 C++ 函式庫專案之一。 Herb SutterAndrei Alexandrescu,《C++ Coding Standards

PrevUpHomeNext

第 42 章 Boost.Typeof

Arkadiy Vertleyb

Peder Holt

依據 Boost 軟體授權條款 1.0 版散布。(請參閱隨附檔案 LICENSE_1_0.txt 或複製於 https://boost.dev.org.tw/LICENSE_1_0.txt)

目錄

動機
教學
參考
AUTO, AUTO_TPL
COMPLIANT
INCREMENT_REGISTRATION_GROUP
INTEGRAL
LIMIT_FUNCTION_ARITY
MESSAGES
LIMIT_SIZE
REGISTER_TYPE
REGISTER_TEMPLATE
TEMPLATE
TYPEOF, TYPEOF_TPL
TYPEOF_NESTED_TYPEDEF, TYPEOF_NESTED_TYPEDEF_TPL
其他注意事項和技巧
原生 typeof 支援和模擬
三個參與方
支援的功能
需要註冊什麼?
限制
貢獻者
致謝

動機

現今許多樣板函式庫提供物件產生器,利用 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/decltypeauto(請參閱 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 函式庫的目的是提供一個基於函式庫的解決方案,在基於語言的機制被添加到標準中並廣泛使用之前,可以使用它。


PrevUpHomeNext