サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
ブラックフライデー
faithandbrave.hateblo.jp
The Future of Boost (From Vinnie Falco) (2023-05-08 15:46:03) - Boost developers' mailing list Boost C++ Librariesのコンサルティング会社BoostProがなくなって以来、Boostはリーダー不在でふわふわした状態でした。 Boost.Beast作者のVinnie Falco氏が創設した新しい非営利団体The C++ Allianceでは、Boostを復権させるようBoostの基礎部分を刷新し、C++全般を支援していくことを主な目的としています。 この団体では、Boost.Asio作者のChristopher Kohlhoff氏を雇用し、フルタイムでオープンソース活動をできるようにしています。ほかにもスタッフエンジニアとして、Boostのリリースマネージャを長く続けているMars
ひさしぶりにテンプレートメタプログラミングをしました。 候補となる列挙型がだいたい同じ列挙子をもっているけど、一部の列挙型にだけある列挙子が存在する場合もある、という場合に処理を集約させたい場合のコードです。 #define DEFINE_HAS_ENUMERATOR(name) \ struct has_enumerator_##name { \ template <class T> \ static constexpr decltype(T::name, bool{}) \ call(T) { return true; } \ static constexpr bool \ call(...) { return false; } \ } #define HAS_ENUMERATOR(type, name) has_enumerator_##name ::call(type{}) DEF
P0631R8 Math Constants C++20で数学定数が入ることが決まりましたね。やっと標準ライブラリの範囲で円周率を定数として使えるようになります。 ここまでの道のりですが、 constexpr (C++11) 変数テンプレート (C++14) インライン変数 (C++17) 数学定数 (C++20) とても長かったですね。 #include <iostream> #include <numbers> template <class T> T degree_to_radian(T x) { return x * std::numbers::pi_v<T> / static_cast<T>(180.0); } int main() { float y = degree_to_radian(90.0f); std::cout << y << std::endl; // 1.570
[boost] Twenty years and time to retire 1998年5月にBeman氏が提案したことからBoost C++ Librariesプロジェクトがはじまりました。そこから20年が経ったことを期に、Beman Dawes氏がBoostから引退されます。 彼が作成したFilesystem、Timer、Endianといったライブラリは、他者にメンテナンスが移譲されます。 C++界隈ではこれまでにも何人かの著名な方がC++から引退されています。 『Effective C++』シリーズ著者のScott Meyers Boost.MPL作者、『C++ Template Metaprogramming』著者のDave Abrahams (現在はApple社でSwift開発に携わっている) 『Modern C++ Design』著者のAndrei Alexandrescu
Modern C++ Learning - SlideShare Modern C++ Learning from Akira Takahashi 英語の資料ですが、PFNの社内セミナーで「最近のC++の学び方」をテーマにして発表しました。(このブログではとくに書いてなかったですが、2017年10月からPreferred Networks社に転職しました)
2018年2月15日に、『C++ポケットリファレンス』の第3版が発売となります。 [改訂第3版]C++ポケットリファレンス - 技術評論社 [改訂3版]C++ポケットリファレンス - Amazon.co.jp 今回の改訂では、C++17 (ISO/IEC 14882:2017) に対応しています。 執筆関係のこと 執筆自体は2017年4月からはじめて、C++17がISOから発行されたらなるべく早く出版できるよう進めていました。 ツールとしては、執筆環境にGitHubのプライベートリポジトリ、細かい相談ごとにGitterを使用していました。 改訂の内容 C++17では大きな機能がいくつか追加されたため、章立てから見直しています。 エラーハンドリングの主要機能としてstd::optionalクラスが追加されたことから、例外の章を、エラーハンドリングの章に変更 ファイルシステムのライブラリが追加
ISO/IEC 14882:2017 - Programming languages -- C++ C++17がISO/IEC 14882:2017として発行されました。 cpprefjpサイトでのC++17解説は、鋭意製作中です。 C++17 - cpprefjp C++日本語リファレンス 言語機能解説のタスク ライブラリやIssueの対応状況
C++17で入る予定の、可変引数でミューテックスを受け取ってスコープを抜けたらロック解除するscoped_lockクラスですが、C++17がDIS (Draft International Standard) の段階になり、仕様の手直しがもうほぼできない段階になってから、引数順の変更が行われました。 P0739R0 Some improvements to class template argument deduction integration into the standard library この変更は、ドラフト仕様 (Working Draft) としては、さらに次のバージョンのC++20に適用されました (Editor’s Reportを参照) 。しかし、libstdc++、libc++といった標準ライブラリの実装や、cppreferenceサイトなどでは、この変更がC++17に
2017年中に改訂される予定のC++14の次のバージョン、仮称C++1zの更新内容をまとめました。正式名称はISO/IEC 14882:2017、通称C++17になる予定です。 C++1zの概要 C++17は、C++11ほど大きな変更はありませんが、重要な言語機能(構造化束縛とか)や、広く適用できるライブラリ機能が多く入っています。ライブラリは、ファイルシステムが入るのが大きいですね。ようやく標準ライブラリのみで、ファイルサイズを取得したり、ファイルのコピーや移動などを扱えるようになります。 策定体制として、Study Group (SG)と呼ばれる専門家グループがたくさん作られ、そこで同時並行に議論、策定が進められていた仕様のうち、固まったものがいくつかC++1zで導入されます。 それぞれの専門家グループで考えられた仕様はTechnical Specification (TS)という単位
C++1zでは、「畳み込み式 (Fold expressions)」という機能が入ります。これは可変引数テンプレートのパラメータパックに対して集計操作を行うためのものです。 たとえば、整数のシーケンスを与えてその合計値を求める計算は、以下のように書けます: #include <iostream> template <class... Args> int sum(Args... args) { // 「... @ args」が畳み込み式。@の部分は任意の二項演算子 return (... + args); } int main() { int x = sum(1, 2, 3, 4, 5); std::cout << x << std::endl; // 15 } このような計算はこれまで再帰を使用して実装する必要がありましたが、より簡潔に書けるようになりました。 ここでは、argsパラメータ
C言語から引き継がれた「トライグラフ (trigraph)」という機能は、ASCIIより小さなISO/IEC 646という文字コードでもプログラムが書けるように用意された機能で、いくつかの文字の代替表現を使用できるようにするものです。 トライグラフ表現 置き換え後の文字 ??= # ??/ \ ??' ^ ??( [ ??) ] ??! | ??< { ??> } ??- ~ 以下のトライグラフを使用したコードは、 ??=define arraycheck(a,b) a??(b??) ??!??! b??(a??) 以下のように置き換えられます: #define arraycheck(a,b) a[b] || b[a] 文字コードの問題がなくなった現代では、トライグラフは不要になりました。ユーザーにとってわかりにくいこともあり、多くのコンパイラがトライグラフをデフォルトで無効にしたり警告を
bool型に対してインクリメントすると固定でtrueになる仕様がありましたが、この仕様はC++98時点で非推奨になっていました。C++1zではこの機能が削除されます。 以下のようなコードは、C++1zではコンパイルが通らなくなりますので注意してください。 #include <cassert> int main() { bool b1 = false; bool b2 = true; // C++98から非推奨だがC++14まで合法、 // C++1zではコンパイルエラー ++b1; b2++; assert(b1 == true); assert(b2 == true); } ちなみに、bool型に対するデクリメントは元々できません。 仕様としては、「算術型 (arithmetic type) に対してインクリメントできる」と書かれていたものが「(CV修飾された) bool型以外の算術型に
switch文で下のcaseに処理を流すことを「フォールスルー (fallthrough)」と言います。 #include <iostream> int main() { int n = 1; switch (n) { case 1: std::cout << "1" << std::endl; // break; を書かずに、処理を下に流す case 2: std::cout << "2" << std::endl; break; } } 1 2 意図しないフォールスルーによってバグが発生することを防止するために、コンパイラがフォールスルーを検出して、コンパイル時に警告を出力する場合があります。 C++1zでは、意図したフォールスルーであることをコンパイラに伝え、警告を抑制するための[[fallthrough]]属性が導入されます。これは、フォールスルーしたい各caseの最後の式として記
Version 1.62.0 - Boost C++ Libraries Boost 1.62.0リリースノート - boostjp Boost 1.62.0がリリースされました。 リリースノートはいつものように、boostjpサイトで翻訳したものを公開しています。Flastさん、協力ありがとうございました。 新ライブラリ 今回の新ライブラリは、FiberとQVMの2つです。 Boost.Fiberは、ユーザースレッドのライブラリです。コルーチンをスレッドのインタフェースで使えるようにしたようなものです。軽量スレッドとして使えます。 Boost.QVMは、クォータニオン、ベクトル、行列のライブラリです。コンセプトベースで設計されているので、自分で作った型に対して、Boost.QVMのアルゴリズムを適用できます。 主要な更新 Boost.Containerに、C++1z関係の機能が入った。連
C++1zでは、並列アルゴリズムのライブラリが導入されることになりました。このライブラリは、<algorithm>, <numeric>, <memory>で定義されるアルゴリズムのオーバーロードという形で提供されます。 using namespace std::execution; // 実行ポリシーの名前空間 std::vector<int> v = … std::sort(v.begin(), v.end()); // これまで通りの順序実行 std::sort(seq, v.begin(), v.end()); // 明示的に順序実行を指定 std::sort(par, v.begin(), v.end()); // 並列実行を許可 std::sort(par_unseq, v.begin(), v.end()); // 並列and/orベクトル実行を許可 このライブラリの設計は、
C++1zから、標準ライブラリのいくつかの機能が非推奨となります。非推奨となった機能は将来のバージョンで削除される可能性がありますのでご注意ください。 std::iteratorクラス 自作イテレータを作るときに基本クラスとして使用するstd::iteratorクラスですが、これを使ってもイテレータを定義するのはあまり簡単になりませんでした。 このクラスを使用することによって問題がより複雑になってしまうケースもありましたので、非推奨となります。 Boost.Iteratorのようなイテレータを簡単に定義するための新たな仕組みは提供されませんので、標準ライブラリの範囲では、イテレータは最初から最後まで自分で定義することになります。 std::allocatorクラスのいくつかのメンバと、std::allocator<void> C++11からアロケータの中間インタフェースとデフォルト実装を提
C++1zでは、コピー可能かムーブ可能であればどんな型でも代入できるanyクラスが入ります。C++には全ての型の継承元のobjectクラスというものはないので、その代わりにこのクラスを使えます。 このクラスのために、<any>ヘッダが新規追加されます。 #include <iostream> #include <any> #include <string> int main() { std::any a = 3; // int値を代入 a = std::string("hello"); // stringオブジェクトを代入 // 中身を取り出す // 取り出せなかったらstd::bad_any_cast例外 try { std::string s = std::any_cast<std::string>(a); std::cout << s << std::endl; } catch (s
C++1zから、並行プログラミングで問題になりうる、キャッシュの無効化問題を制御できるようになります。 false sharingの制御 struct keep_apart { atomic<int> cat; atomic<int> dog; }; このような構造体がある場合、catとdogが同じキャッシュラインに乗ることがあります。スレッド1ではcat変数、スレッド2ではdog変数を操作するような状況で、それぞれが共通のキャッシュを無効化してしまうパフォーマンス劣化の問題が起こりえます。こういった状況をfalse sharingと言いますが、これを回避するために、<new>ヘッダにstd::hardware_destructive_interference_sizeという定数が定義されます。(「破壊的な干渉サイズ」といったところでしょうか) この定数を構造体メンバのアライメントとして指
C++1zから、インクルードするファイルが存在するかを確認するプリプロセッサ機能が追加されます。 __has_include式の引数として、ダブルクォーテーションで囲まれたインクルードファイル名、山カッコで囲まれたインクルードファイル名、もしくはプリプロセッサトークン名を指定することで、プリプロセス時にそのファイルが存在するかを#if/#elifで確認できます。 // <optional>ヘッダが存在していたらインクルードする #if __has_include(<optional>) #include <optional> #endif // "optional"ヘッダが存在していたらインクルードする #if __has_include("optional") #include "optional" #endif #define OPTIONAL_HEADER <optional> //
最近のC++標準ライブラリとBoostのちょっとした流行りな気がしますが、タグディスパッチのタグをユーザーに明示的に指定させることで、関数オーバーロードを容易にする方法がいくつかの場所でとられています。 たとえば、Boost.Containerのvectorには、以下のコンストラクタがあります。 // タグの定義 struct default_init_t {}; constexpr default_init_t default_init {}; // vectorのコンストラクタ vector::vector(size_type, default_init_t); // 3要素の配列を用意し、各要素の値を未初期化状態にする vector<T> v(3, default_init); この場合、単に3という1引数を渡すだけだと値初期化したリサイズ操作になりますが、default_initと
C++14 - cpprefjp C++日本語リファレンス C++14の言語機能解説が一通りできました。C++11の方は残り11個なので、3月中くらいにできるかもしれません。 問題報告とpull requestは、cpprefjp/siteリポジトリまでお願いします。あとちょっと・・・。 広告の代わりに cpprefjpサイトは現在、広告もなにも置いておらず、ビジネスモデルがない状態です。私個人宛てにはなりますが、応援してくださる方がいらっしゃいましたら、以下のAmazonウィッシュリストを見ていただければと思います。 Amazonウィッシュリスト ギフト券のウィッシュリスト
WindowsとMacでリポジトリを共有していると、日本語ファイル名の問題が出てきます。「ボタン.png」のようなファイルがあった場合、Windowsのファイルシステムでは「ボ」はひとつのコードポイントとして扱われますが、Macのファイルシステムでは「ホ」と「゛」が分解されます。 これは、Unicodeの結合文字に対する正規化の扱いが、OSのファイルシステムごとに異なるということです。 これによって、Gitを使ってWindowsで「ボタン.png」をコミットし、Macでそのコミットを持ってくると、「ボタン.png」を削除して「ホ゛タン.png」を追加するような動作になるのです。 この問題を解決するために、Mac OSでのGit実装には、core.precomposeUnicodeという設定があります。configファイルで以下のようになっていた場合、 [core] … precompose
Version 1.60.0 - Boost C++ Libraries Boost 1.60.0リリースノート - boostjp Boost 1.60.0がリリースされました。 いつものように、リリースノートを翻訳し、情報補完したものを、boostjpサイトで公開しています。 新ライブラリ 可変引数マクロを使用した、プリプロセス時データ構造のライブラリVMDが追加されました 主な更新 Boost.Containerに、Polymorphic Memory Resourcesが実装されました Boost.Filesystemに、パスの正規化をする関数が追加されました Boost.Filesystemが、noexceptとムーブに対応しました Boost.Predefに、SIMDハードウェアの検出機能が追加されました Boost.HanaとBoost.DLLは、リリースが次回以降に延期され
cpprefjp - C++日本語リファレンス 以下のコミットで、正規表現ライブラリのリファレンス作成が完了しました。 basic_regex : サンプルコードを追加(fix #265) - cpprefjp/site <regex>ヘッダ - cpprefjp C++日本語リファレンス またこれにより、C++日本語リファレンスサイトcpprefjpの、ライブラリ編が完了しました。 Iostreamとロケール関係の9ヘッダがまだ残っていますが、それは追々やります。現在は、それ以外の43ヘッダ + C互換ライブラリの一部のリファレンス作成が完了し、C++14への対応も完了しています。 このサイトの現在のページ数は2,543ページと、書籍にして8冊分くらいの分量になっています。がんばりました、つかれました。 振り返り 2011年1月に作ったこのcpprefjpというサイトは、できるだけ全ての
Version 1.59.0 Boost 1.59.0リリースノート - boostjp Boost 1.59.0がリリースされました。リリースノートはいつものように、boostjpサイトで翻訳を行い、公開しています。 新ライブラリ Convert Boostには以前からlexical_cast()という強力な数値・文字列間の変換関数がありました。このライブラリは、それをより強力にした機能が多数入っています。 たとえば、型変換の際に使用するマニピュレータを指定できるようになったので、基数(2進数、16進数とか)の指定、浮動小数点数の精度の指定などができます。ほかにも、変換に失敗したときのエラー処理も、選択の幅が広がったりしています。 Coroutine2 C++14で書かれたコルーチンライブラリです。前バージョンは非推奨となります。 主な更新内容 Multi-Index 少し前にこのブログ
Boost 1.59.0から、Boost.Multi-indexに、ranked indiciesというのが入ります。 これは、キーが何番目に大きいかを対数時間で取得できる、連想配列のインデックスです。 イメージとしては、mapに対してit = m.find(key)をして得たイテレータに、distance(m.begin(), it)としてイテレータの位置を求めるのが、容易になるという感じです。 #include <iostream> #include <boost/multi_index_container.hpp> #include <boost/multi_index/ranked_index.hpp> #include <boost/multi_index/member.hpp> struct Person { int age = 0; std::string name; Per
改訂新版 C++ポケットリファレンス - 技術評論社 改定新板 C++ポケットリファレンス - Amazon.co.jp おかげさまでご好評いただいております書籍『C++ポケットリファレンス』ですが、この度、C++規格の最新バージョンC++14(ISO/IEC 14882:2014)に対応した改訂版を出版します。 基本文法、ライブラリの各章において、C++14で追加された機能の解説を加筆しました。 また、それ以外の項目についても、解説の加筆や改善を行っています。 ページ数も16ページほど増量し、544ページになっています。そろそろポケットに収納するのは厳しいかもしれません。 コンパイラのC++14への対応も非常に早いので、より多くの方にC++14の機能を使っていただければ幸いです。 『C++ポケットリファレンス』第2版は、2015年6月4日に発売予定です。電子書籍版は、技術評論社のDigi
コンパイラの実装状況 - cpprefjp C++日本語リファレンス Clang 3.6がリリースされたので、cpprefjpの「コンパイラの実装状況」ページにC++1zの状況をまとめました。 Clang 3.6のリリースノートは以下: Clang 3.6 Release Notes — Clang 3.6 documentation
以下のコードは、コンパイルエラーになる: template <class Iterator> Iterator f(const Iterator& it) { return it; } int main() { int ar[] = {1, 2, 3}; f(ar); // コンパイルエラー!呼び出し可能なf()のオーバーロードがない } 関数f()はイテレータをconst左辺値参照で受け取る。このようにした場合、テンプレートパラメータIteratorはint[3]に推論される。C++の言語仕様として、組み込み配列はreturn文で返せないので、コンパイルエラーになる(実際には、戻り値型のところでSFINAEが起きる)。 以下のように、イテレータをコピーで受け取ることで関数f()を呼び出せるようになる: template <class Iterator> Iterator f(Iterat
次のページ
このページを最初にブックマークしてみませんか?
『Faith and Brave - C++で遊ぼう』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く