C++

C++1z owner_lessで任意の要素型を持つshared_ptr同士を比較できるようにする

C++

所有権ベースの小なり比較を行うstd::owner_less関数オブジェクトですが、そのクラステンプレートのパラメータによってスマートポインタの要素型を制約してしまうため、以下のような比較ができませんでした。 shared_ptr<int> sp1; shared_ptr<void> sp2; shared_ptr<long> sp</long></void></int>…

C++1z 時間の丸め演算

C++

時間ユーティリティライブラリの<chrono>には、精度が下がる単位変換をする場合に使用するduration_cast()関数があります。 C++1zでは、このときの丸め演算をユーザーが選択するための機能が導入されます。 まず、整数を時間間隔の値型とするdurationのための、floor</chrono>…

C++1z hypot関数の3引数版

C++

C++11で<cmath>に追加されたhypot()関数ですが、2引数(2次元)の演算のみが用意されていました。 C++1zでは、3引数版が追加されます。動機としては、科学計算や工学アプリケーションで3次元の演算をすることが多いためだそうです。 // <cmath> namespace std { double hypot</cmath></cmath>…

C++1z 数学の特殊関数

C++

C++1zでは、C++11のころから繰り越されていた数学の特殊関数(special functions)が導入されます。 一覧としては、以下になります: 関数名 説明 assoc_laguerre ラゲールの陪多項式 associated Laguerre polynomials assoc_legendre ルジャンドルの陪多項式 …

C++1z false sharingとtrue sharingの制御

C++

C++1zから、並行プログラミングで問題になりうる、キャッシュの無効化問題を制御できるようになります。 false sharingの制御 struct keep_apart { atomic<int> cat; atomic<int> dog; }; このような構造体がある場合、catとdogが同じキャッシュラインに乗ることがあり</int></int>…

C++1z 値を範囲内に収めるclamp()関数

C++

値を、min <= v <= maxのように範囲内に収める関数として、clamp()が定義されます。 std::min(std::max(min_value, x), max_value)のようにするのと同等の効果があります。 引数の順番は、対象の値、最小値、最大値です。戻り値として範囲内に丸められた値が…

C++1z swap可能かを判定する型特性クラス

C++

swap操作をラップした関数のnoexcept条件を書きやすくすることを主な目的として、C++1zから以下の型特性クラスが追加されます。 型Tがswap可能かを判定するis_swappable<T> 型Tと型Uの組み合わせでswap可能かを判定するis_swappable_with<T, U> 例外を送出せずにswap</t,></t>…

C++1z 現在発生している例外の数を取得するuncaught_exceptions()関数

C++

C++98時点で、捕捉していない例外があるかどうかを判定するstd::uncaught_exception()関数が定義されていました。この関数は、例外が送出されてから捕捉されるまでの間でtrueを返します。 C++1zでは、捕捉していない例外がいくつあるかを返すstd::uncaught_e…

Boost.勉強会 #20 東京をやります

C++

Boost.勉強会 #20 東京 - connpass 2016年07月23日に、IIJさんの会場をお借りして、Boost.勉強会を開催します。 今回私は、C++1zについて話す予定です。 皆さまのご参加をお待ちしております。

C++1z atomic<T>::is_always_lock_free

C++

C++11時点では、atomic<T>クラステンプレートの非静的メンバ関数としてis_lock_free()が用意されていました。この関数は、T型のatomicオブジェクトがロックフリーに振る舞うかどうかをbool値で返します。この関数が返す値はTの型ごとに静的な値ですが、atomicク</t>…

C++1z コンテナに不完全型の最小サポートを追加

C++

定義が完了していない不完全型(incomplete type)はsizeofがとれないので、アロケータとそれを使用するコンテナの実装が少し難しくなる場合があります。ですが、自分自身の型のオブジェクトがいくつあるかカウントする、というような場合に以下のようなコード…

C++1z ファイルシステムライブラリ

C++

C++1zでは、ファイルパス、ディレクトリ、ファイルのコピー・移動などを扱うファイルシステムライブラリが導入されます。 このライブラリは、Boost Filesystem Library v3をベースにしています。basic_path<CharT>のように文字型をパラメータとするのではなく、path</chart>…

C++1z オブジェクトをconstにするas_const関数

C++

C++1zから<utility>ヘッダに、as_const()関数テンプレートが追加されます。 この関数は、引数として渡されたオブジェクトをconstにします。その際、オブジェクトのコピーは発生しません。また、この関数に右辺値は渡せません。 #include <iostream> #include <utility> int main() { std:</utility></iostream></utility>…

C++1z shared_from_thisの指す先が書き換わらないことを規定

C++

thisポインタをstd::shared_ptrとして取得するための機能として、std::enable_shared_from_this基本クラスとそのメンバ関数shared_from_this()があります。 std::enable_shared_from_thisから派生したクラスのオブジェクトをnewしてshared_ptrのコンストラク…

C++1z reference_wrapperがTriviallyCopyableであることを保証

C++

C++11では、関数テンプレートに渡す引数を参照として渡すことを明示するstd::reference_wrapperクラスが導入されました。 これは通常、オブジェクトへの参照を受け取ってそのポインタを保持しておく、という簡単な方法で実装されます。このような実装になっ…

C++1z コンテナの要素情報にアクセスする非メンバ関数

C++

C++11では、範囲for文を拡張することを目的として、std::begin()、std::end()という非メンバ関数が導入されました。 std::vector<T> v; // 先頭要素を指すイテレータ、終端イテレータを非メンバ関数で取り出す decltype(v)::iterator first = std::begin(v); de</t>…

C++1z 値を返す型特性クラスのconstexpr変数テンプレート版

C++

C++14では、f<Arg>::typeのような型を返す型特性クラスに対して、f_t<Arg>のように_tをクラス名に付けて::typeを省略するエイリアステンプレート版が追加されました。 C++1zでは、f<Arg>::valueのような値を返す型特性クラスに対して、f_v<Arg>のように_vをクラス名に付けて::val</arg></arg></arg></arg>…

C++1z shared_mutex

C++

C++14では、Readers-writerパターンという、読み込み操作が多い状況で使うミューテックスとして、std::shared_timed_mutexクラスが導入されました。 C++1zでは、タイムアウト付きロック取得機能がないクラスとして、shared_mutexクラスが導入されます。 // <shared_mutex> </shared_mutex>…

C++1z スコープ付きロックの可変引数版

C++

関数内でロックを取得したミューテックスを、関数の終わりで確実にロックを手放すstd::lock_guard<MutexType>クラスがありますが、C++1zから可変個のミューテックス型およびミューテックスオブジェクトをとるstd::scoped_lockクラスが追加されます。 std::mutex m1; std</mutextype>…

C++1z コンパイル時条件の論理演算

C++

C++11時点で、コンパイル時条件をハンドリングするメタ関数として、以下があります: std::conditional (boost::mpl::if_c相当) std::enable_if (boost::mpl::enable_if_c相当) std::is_same C++1zからは、コンパイル時条件の論理演算を行う3つのメタ関数と…

C++1z bool_constant

C++

C++1zから、標準ライブラリの<type_traits>に、integral_constantの第1テンプレート引数をboolにした別名のbool_constantが追加されます。 それにともない、true_typeとfalse_typeの定義が、integral_constantを使ったものからbool_constantを使ったものに変更されます。 </type_traits>…

Boost 1.61.0がリリースされました

C++

Version 1.61.0 - Boost C++ Libraries Boost 1.61.0リリースノート - boostjp Boost 1.61.0がリリースされました。 リリースノートはいつものように、boostjpサイトで翻訳 + 情報補完したものを公開しています。今回は新ライブラリが4つもあります。 GPGPU…

C++1z 関数が呼び出し可能かを判定する型特性

C++

C++1zからは、関数が呼び出せるかどうかをコンパイル時に判定する型特性として、is_callableとis_nothrow_callableの2つが<type_traits>に追加されます。 // <type_traits> namespace std { template <class Fn, class... ArgTypes> struct is_invocable; template <class R, class Fn, class... ArgTypes> struct is_invocable_r; template <class Fn, class... ArgTypes> …</class></class></class></type_traits></type_traits>

C++1z constexprラムダ

C++

C++1zからは、ラムダ式をconstexprとして定義・実行できるようになります。 ラムダ式をconstexprにするには、これまでmutableを付けていたところに、constexprを付けます。 int main() { auto add = [](int x) constexpr { return x + 1; }; static_assert(a…

C++1z 範囲for文のためのbegin()とend()関数が、異なる型を返すことを許可

C++

C++11時点での範囲for文は、begin()関数とend()関数が同じ型のイテレータオブジェクトを返すことを要求していました。 しかし、end()の方のイテレータは特殊な型にしたいことがたまにあります。ストリームイテレータを作ろうとするときとかもそうだと思いま…

C++1z 浮動小数点数の16進数リテラル

C++

C++1zから、浮動小数点数リテラルを16進数で表記できるようになります。 たとえば、IEEE 754で定められている、単精度浮動小数点数の正の正規化数のうち最小の値である2-126は、10進数表現では1.17549e-38fですが、16進数で表記すれば0x1.0p-126fのように書…

C++1z インクルードするファイルが存在するかを確認する__has_include

C++

C++1zから、インクルードするファイルが存在するかを確認するプリプロセッサ機能が追加されます。 __has_include式の引数として、ダブルクォーテーションで囲まれたインクルードファイル名、山カッコで囲まれたインクルードファイル名、もしくはプリプロセッ…

コンストラクタに用途別の名前を付ける

C++

最近のC++標準ライブラリとBoostのちょっとした流行りな気がしますが、タグディスパッチのタグをユーザーに明示的に指定させることで、関数オーバーロードを容易にする方法がいくつかの場所でとられています。 たとえば、Boost.Containerのvectorには、以下…

C++1z ラムダ式での*thisのコピーキャプチャ

C++

ラムダ式のキャプチャリストにthisを指定した場合、そのラムダ式が所属するクラスのオブジェクトが参照キャプチャされます。 非同期処理や並列処理を記述するような状況で*thisが参照キャプチャされると、そのオブジェクトの寿命を管理するのが難しくなりま…

型のプレースホルダー

C++

Boost.MPLのapplyメタ関数のように、プレースホルダーにしたテンプレート引数をあとで置き換える実装のサンプルです。 テンプレートテンプレートパラメータを使った部分特殊化で実装します。 #include <iostream> #include <vector> #include <list> template <class T> class my_vector { std</class></list></vector></iostream>…