![]() |
Home | Libraries | People | FAQ | More |
Copyright 2004, 2005 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
如今,很多模板庫都提供對像生成器,利用 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 庫的目標是提供一個基於庫的解決方案,它可以使用,直到基於語言的設施被加入標準並被廣泛使用。
|
Last revised: November 25, 2007 at 13:38:02 -0500 |