C++

文字列連結

C++

char配列、char、std::stringの任意の組み合わせを連結する関数を書きました。メモリ確保を一回だけします。 C++17の畳み込み式で、全体の文字列長を計算しています。 #include <string> #include <cstring> #include <utility> std::size_t string_length(const std::string& s) noexc</utility></cstring></string>…

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

C++

Version 1.67.0 - Boost C++ Libraries Boost 1.67.0リリースノート - boostjp Boost 1.67.0がリリースされました。リリースノートはいつものように、翻訳 + 情報補完したものをboostjpサイトで公開しています。 今回の新ライブラリは、契約プログラミングを…

1引数コンストラクタ以外に対するexplicit指定

C++

C++03では、ひとつの引数をとるコンストラクタで変換コンストラクタ以外に対してはexplicitを付ける、という慣習がありました (別の言い方をすると、パラメータ付き構築にexplicitを付ける)。 C++11では、波カッコ構文による「一様初期化 (Uniform Initializ…

最近のC++の学び方について発表しました

C++

Modern C++ Learning - SlideShare Modern C++ Learning from Akira Takahashi 英語の資料ですが、PFNの社内セミナーで「最近のC++の学び方」をテーマにして発表しました。(このブログではとくに書いてなかったですが、2017年10月からPreferred Networks社に…

C++17対応の『C++ポケットリファレンス』 第3版

C++

2018年2月15日に、『C++ポケットリファレンス』の第3版が発売となります。 [改訂第3版]C++ポケットリファレンス - 技術評論社 [改訂3版]C++ポケットリファレンス - Amazon.co.jp 今回の改訂では、C++17 (ISO/IEC 14882:2017) に対応しています。 執筆関…

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

C++

Version 1.66.0 - Boost C++ Libraries Boost 1.66.0リリースノート - boostjp リリースノートはいつものように、日本語訳 + 情報補完したものをboostjpサイトで公開しています。 今回、新ライブラリはBeast (HTTPライブラリ)、CallableTraits (関数呼び出し…

C++17がISOから発行されました

C++

ISO/IEC 14882:2017 - Programming languages -- C++ C++17がISO/IEC 14882:2017として発行されました。 cpprefjpサイトでのC++17解説は、鋭意製作中です。 C++17 - cpprefjp C++日本語リファレンス 言語機能解説のタスク ライブラリやIssueの対応状況

静的なメンバ定数を参照するとリンクエラーとなる

C++

クラス内にstatic constexpr Tで宣言した定数を、std::vector::emplace_back()関数とかに渡すと、リンクエラーになる場合があります。 ミニマムなコードとしては、以下のようになります: struct X { static constexpr int x = 3; }; template <class T> void f(T&&) </class>…

書籍 C++ Templates: The Complete Guide, 2nd Edition

C++ Templates: The Complete Guide, 2nd Edition - InformIT C++ Templates: The Complete Guide (2nd Edition) - Amazon.co.jp 書籍『C++ Templates: The Complete Guide』の第2版が発売しました。 初版はC++03でしたが、今回の改訂でC++17対応しています。…

Boost 1.65.1リリース

C++

Version 1.65.1 - Boost C++ Libraries Boost 1.65.1リリースノート - boostjp Boost 1.65.0に重大なバグが何件かあったため、パッチバージョンアップしたBoost 1.65.1がリリースされました。1.65.0はスキップして1.65.1を使用してください。 1.65.1のリリー…

Boost 1.65.0リリース

C++

Version 1.65.0 - Boost C++ Libraries Boost 1.65.0リリースノート - boostjp Boost 1.65.0がリリースされました。リリースノートの日本語訳は、いつものようにboostjpサイトで公開しています。 新ライブラリとして、PolyCollectionとStacktraceが追加され…

標準C++の欠陥解決は、過去のバージョンに遡って適用される

C++

C++17で入る予定の、可変引数でミューテックスを受け取ってスコープを抜けたらロック解除するscoped_lockクラスですが、C++17がDIS (Draft International Standard) の段階になり、仕様の手直しがもうほぼできない段階になってから、引数順の変更が行われま…

インクルードするディレクトリをマクロ定数として持つ

C++

とある事情から「インクルードするディレクトリが長いので何度も書きたくない」という状況になり、インクルードするディレクトリをマクロ定数に持って、インクルードするファイル名と連結してインクルードしたい、ということがありました。 そんなときの対応…

C++17標準ライブラリの細かい変更いろいろ その1

C++

最近cpprefjpに書いたものを列挙します。 assertマクロがconstexpr関数内で使用できるようになった std::next()関数のイテレータ要件がForward IteratorからInput Iteratorに緩和された std::addressof()がconst T&&の引数を禁止にした。addressof<const T>(T())のよ</const>…

標準ライブラリの実装で追加のnoexceptが付いている場合がある

C++

標準ライブラリの仕様でnoexceptが付いているものは、実装にもnoexceptを付けることが求められます。 しかし、標準ライブラリの仕様でnoexceptが付いていない場合、実装にnoexceptを付けないことは求められません。 たとえば、libc++のstd::vectorクラスでは…

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

C++

Version 1.64.0 - Boost C++ Libraries Boost 1.64.0リリースノート - boostjp Boost 1.64.0がリリースされました。リリースノートを日本語翻訳したものは、いつものようにboostjpサイトで公開しています。 新ライブラリ Process マルチプラットフォームで動…

C++1zの言語拡張まとめ

2017年中に改訂される予定のC++14の次のバージョン、仮称C++1zの更新内容をまとめました。正式名称はISO/IEC 14882:2017、通称C++17になる予定です。 C++1zの概要 C++17は、C++11ほど大きな変更はありませんが、重要な言語機能(構造化束縛とか)や、広く適用…

C++1z using宣言のパック展開

C++

using宣言 (using-declaration) には、2つの用途があります: メンバ関数を、基本クラスと派生クラスでオーバーロードする 識別子の名前空間を省略できるようにする これらusing宣言に指定する識別子が、ひとつだけでなく、カンマ区切りで複数指定できるよう…

C++1z shared_ptr::use_count()の仕様を明確化し、unique()を非推奨化

C++

std::shared_ptrクラスのメンバ関数use_count()とunique()は参照カウンタがいくつあるか (リソースを共有しているユーザーが何人いるか) を返すもので、デバッグ目的にしか使用しません。また、複数スレッドから使用するには、仕様が不明確でした。 use_coun…

C++1z shared_ptrの配列対応

C++

C++1zでは、unique_ptr<T[ ]>と同様に、shared_ptrもテンプレート引数をshared_ptr<T[ ]>もしくはshared_ptr<T[N]>のように指定することで、配列を扱えるようになります。 std::shared_ptr<double[1024]> p1 {new double[1024]}; std::shared_ptr<double[]> p2 {new double[n]}; // 添字アクセス double</double[]></double[1024]></t[n]></t[></t[>…

C++1z Chronoライブラリ durationクラスとtime_pointクラスの変更操作をconstexpr対応

C++

ChronoライブラリはC++11, C++14と段階的にconstexprの対応を進めてきました。C++1zでは、durationの変更操作、time_pointの変更操作が全てconstexpr対応します。 template <class Rep, class Period = ratio<1>> class duration { public: constexpr duration& operator++(); constexpr duratio</class>…

C++1z char_traitsのconstexpr対応

C++

C++1zでのstring_viewの追加にともない、その実装に必要なstd::char_traitsクラスの一部メンバ関数がconstexprに対応します。 constexpr対応するのは、以下のメンバ関数です: static constexpr int compare(const char_type* s1, const char_type* s2, size…

C++1z 値のコピー省略を保証

C++

関数の戻り値のコピーを発生させない手法として、RVO (Return Value Optimization) やNRVO (Named Return Value Optimization) といった最適化がありました。 // RVOの最適化が動作した場合 struct Foo {}; Foo foo() { return Foo(); } Foo x = foo(); // F…

整数を、任意の基数の文字列に変換する

C++

除算と剰余で作れる。テーブルを拡張すれば何進数でもいける。 #include <iostream> #include <cassert> #include <string> #include <sstream> template <class Integer> std::string to_base_string(Integer x, int base) { assert(base >= 2 && base <= 16); if (x == 0) return "0"; const std::string table</class></sstream></string></cassert></iostream>…

浮動小数点数を2の乗数で割る

C++

a/bをする場合、bが2の乗数であれば「aの指数 - log2(b)」で除算ができます。 #include <iostream> #include <bitset> #include <cstdint> #include <cassert> #include <cmath> union SingleFloat { float value; struct { int fraction : 23; int exponent : 8; bool sign : 1; } parts; }; SingleFloa</cmath></cassert></cstdint></bitset></iostream>…

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

C++

Version 1.63.0 - Boost C++ Libraries Boost 1.63.0リリースノート - boostjp Boost 1.63.0がリリースされました。リリースノートはいつものように、翻訳・情報補完したものをboostjpサイトで公開しています。 このバージョンは、まだリリースされていないV…

Nが2の何乗かを調べる

C++

C++11から標準数学ライブラリに入ったstd::log2()関数を使えば、Nが2の何乗かを取得できます。 #include <iostream> #include <cmath> int main() { std::cout << std::log2(4.0) << std::endl; std::cout << std::log2(8.0) << std::endl; // 8は2の3乗 std::cout << std::lo</cmath></iostream>…

C++11 標準ストリームへの出力はスレッドセーフ

C++

本記事の本題とする、「一回の書き込みにすれば排他制御は必要ない」という部分が誤りであったため、本記事を取り下げます。 C++11から標準ライブラリに、並行プログラミングのための各種機能が入った影響は、入出力のライブラリにもあります。スレッドの存…

C++1z if constexpr文

C++

C++1zから、コンパイル時条件によって分岐するif constexpr文が導入されます。これにより、再帰やヘルパ関数を書かなくて済むケースが多くなります。 D言語にあるstatic if文のようなものです。 template <class T, class... Rest> void g(T&& p, Rest&&... rs) { if constexpr (size</class>…

C++1z 非推奨だった古い例外仕様を削除

C++

C++11でnoexceptが導入されたことによって非推奨になっていたthrowキーワードによる関数の例外仕様が、C++1zで削除されます。 throwキーワードによる例外仕様とは、void f() throw(std::runtime_error)のように、その関数がどの種類の例外を送出する可能性が…