Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

Chapter 22. Boost.Typeof

Arkadiy Vertleyb

Peder Holt

Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt )

Table of Contents

Motivation(動機)
Tutorial(指南)
Reference(參考)
AUTO, AUTO_TPL
COMPLIANT
INCREMENT_REGISTRATION_GROUP
INTEGRAL
LIMIT_FUNCTION_ARITY
LIMIT_SIZE
REGISTER_TYPE
REGISTER_TEMPLATE
TEMPLATE
TYPEOF, TYPEOF_TPL
TYPEOF_NESTED_TYPEDEF, TYPEOF_NESTED_TYPEDEF_TPL
Other considerations and tips(其它考慮和提示)
Native typeof support and emulation(原生 typeof 支持及仿真)
The three participating parties(三個參與方)
Supported features(支持的特性)
What needs to be registered?(需要註冊什麼?)
Limitations(限制)
Contributed By:(發佈者:)
Acknowledgements(感謝)

Motivation(動機)

如今,很多模板庫都提供對像生成器,利用 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 庫的目標是提供一個基於庫的解決方案,它可以使用,直到基於語言的設施被加入標準並被廣泛使用。

Last revised: November 25, 2007 at 13:38:02 -0500


PrevUpHomeNext