2016-01-07

C++標準化委員会の文書のレビュー: P0022R1-P0092R1

今回も改訂版の文書のレビュー。改定前の文書は、以下の記事でレビューしている。

本の虫: C++標準化委員会の文書のレビュー: P0021R0-P0029R0

本の虫: C++標準化委員会の文書のレビュー: P0030R0-P0039R0

本の虫: C++標準化委員会の文書: P0050R0-P0059R0

本の虫: C++標準化委員会の文書のレビュー: P0060R0-P0069R0

本の虫: C++標準化委員会の文書のレビュー: P0080R0-P0089R0

本の虫: C++標準化委員会の文書のレビュー: P0090R0-P0099R0

P0022R1: Proxy Iterators for the Ranges Extensions

vector::iteratorのようなプロクシーイテレーターとそれ以外のイテレーターがうまく汎用的に扱えない問題を解決するライブラリの変更の提案。

これまで存在はするもののあまり活用されていなかったiter_swapを、例外的な挙動をするイテレーターのためのカスタマイゼーションポイントとして定義しなおすほか、iter_moveを追加する。イテレーターを操作する際は、このライブラリを使えば、プロクシーイテレーターを意識せずに扱うことができる。

また、共通の束縛できるリファレンス型を得る。common_reference traitsを追加する。2つのイテレーターのvalue_typeをcommmon_referenceに渡すことでコードを汎用的にできる。common_referenceはcommon_typeに似ているが、トップレベルのCV修飾子とリファレンス修飾子を削らない。

P0025R1: clamp: An algorithm to 'clamp' a value between a pair of boundary values -

clamp( value, min, max )で、valueがminより小さければminが、maxより大きければmaxが、それ以外の場合はvalueが返る関数clampの提案。

[PDF] P0030R1: Proposal to Introduce a 3-Argument Overload to std::hypot

3引数版std::hypotの提案。

[PDF] P0032R1: Homogeneous interface for variant, any and optional (Revision 1)

variant, any, optionalというtype erasure機能を提供する用途の異なるライブラリが提案されている。type erasureという機能では共通しているこれらのライブラリは、インターフェースがバラバラだ。インターフェースをある程度統一する提案。

[PDF] P0051R1: C++ generic overload function (Revision 1)

非情に面白いoverloadライブラリの提案。関数オブジェクトを突っ込んで、突っ込んだ関数オブジェクトの中でオーバーロード解決が最適なものを呼び出してくれる。

std::f = std::overload(
    []( int x ) { }, // #1
    []( double d ) { }, // #2
    []( auto x ) { } ) ; // #3

f( 0 ) ; // #1
f( 0.0 ) ; // #2
f( "hello" ) ; // #3

実装例は前回の記事で解説したが極めて単純で興味深い。

前回からの変更点としては、最適関数を選ぶoverload, 呼び出し可能な最初の関数を選ぶfirst_overload, 格納した関数オブジェクトにアクセスする機能の3種類に提案を分割し、それぞれ独立して提案することにしたらしい。

[PDF] P0057R1: Wording for Coroutines

コルーチンの文面案。変更点は、とうとうキーワードが決定されたこと。co_await, co_yield, co_returnになった。なんだか泥臭い名前だ。しかし、await, yieldなど使えるわけがない。

future<void> g()
{
   std::cout << "processing f" << std::endl ;
   co_await f() ;
   std::cout << "resumed" << std::endl ;
}

うーむ。バイク小屋バイク小屋。

P0061R1: Feature-testing preprocessor predicates for C++17

プリプロセッサーでのみ使える__has_includeの追加。ヘッダーファイルが存在するかどうかを調べられる。

#if __has_include(<any>)
#include <any>
using lib = std ; 
#elif __has_include(<boost/any.hpp>)
#include <boost/any.hpp>
using lib = boost ;
#endif

lib::any a ;

[PDF] P0083R1: Splicing Maps and Sets (Revision 3)

listにあるsplice機能をmapにも提供する提案。前回からの変更点は、node_ptrがnode_handleになったこと。operator *, operator ->が廃止され、かわりにmappedとvalueというアクセッサー関数が追加されたこと。空の状態を調べられるempty関数が追加された。機能テストマクロが追加されたなど。

mapが管理する内部の動的に確保されたメモリ上に構築されたノードの所有権をmapから切り離すことができる機能。

extractでmapからノードの所有権を切り離す。切り離されたノードはnode_handleクラスを経由して扱う。node_handleはアロケーターのコピーも持っているので、破棄された時にはノードも破棄される。キーを変更することもできる。mergeでnode_handleの所有するノードをmapにマージできる。

キーを変更して差し戻すことにより、余計なメモリの破棄、確保を省略することができる。

P0092R1: Polishing chrono

chronoライブラリに対する機能追加。丸めモードの設定、符号付きduration型にabsを追加する。

ドワンゴ広告

ドワンゴは本物のC++プログラマーを募集しています。

採用情報|株式会社ドワンゴ

CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0

1 comment:

Anonymous said...

コルーチンって途中経過を返却することって可能なんですか?自分にとってはそれが一番の期待です。
オーバーロードライブラリがなんか面白いことになってますね。
clampってまだもめてるんですか?並びはよくなったと思いますが。