タグ

ブックマーク / faithandbrave.hateblo.jp (15)

  • チェック付き間接参照の提案 またの名をパターンマッチ - Faith and Brave - C++で遊ぼう

    N4127 Checked-dereference conditions ポインタ操作では、以下のように「間接参照可能か(有効な値を指すポインタか)」をチェックしてから間接参照する、というのがよく行われます。 if (p) { T x = *p; } これを以下のように書けるようにしよう、というのがこの提案。 if (T x : p) { } つまり、間接参照ができるなら間接参照をして値を取り出す、までを一つのif文でやってしまおうというものです。 これは、値の判定と取り出しを同時に行う、ミニマムなパターンマッチと見なすことができます。 この機能は、多くの状況で便利に活用できます。 weak_ptrの場合 weak_ptrは、lock()メンバ関数を使用してshared_ptrオブジェクトを取り出します。その際、以下のようなコードを書くことになりますが、 if (shared_ptr<T>

    チェック付き間接参照の提案 またの名をパターンマッチ - Faith and Brave - C++で遊ぼう
    xmx3
    xmx3 2014/08/02
  • immutable_vectorを作った - Faith and Brave - C++で遊ぼう

    初期化時に要素の追加・変更を行い、そのあとに「もう変更しない」ことを明示できるvectorを作りました。ムーブがあるので簡単に作れた。 ソース : shand/immutable_vector.hpp 例: #include <iostream> #include <shand/immutable_vector.hpp> int main() { // 要素の追加・変更 shand::vector_builder<int> v; v.push_back(1); v.push_back(2); v.push_back(3); // もう変更しない shand::immutable_vector<int> iv(std::move(v)); for (int x : iv) { std::cout << x << std::endl; } } 使い方としては、以下のようになります。 vecto

    immutable_vectorを作った - Faith and Brave - C++で遊ぼう
    xmx3
    xmx3 2014/08/02
  • C++テンプレートテクニック 第2版 を出します - Faith and Brave - C++で遊ぼう

    2009年に出版した書籍『C++テンプレートテクニック』の第2版を出版します。 C++テンプレートテクニック 第2版 - Amazon.co.jp C++テンプレートテクニック 第2版 - SBクリエイティブ 発売日は、2014年4月17日(木)です。 C++テンプレートテクニック 書は、プログラミング言語C++のテンプレート機能に関する技法を解説したです。 プログラムをより汎用的にしていくにあたって起きる、様々な問題への解法を提供します。 第2版の更新内容 第2版の主な更新は、C++11への対応です。C++11に追加された機能を使用した各種技法を掲載しています。C++03の技法で今もなお有用なものは残してあります。 第2版では、以下のような変更を行いました: 第1版の章「Extension Member Function」および「C++0xにおけるテンプレート」を削除 新章「コンセプ

    C++テンプレートテクニック 第2版 を出します - Faith and Brave - C++で遊ぼう
    xmx3
    xmx3 2014/03/28
  • C++1y SIMDライブラリの提案 - Faith and Brave - C++で遊ぼう

    N3571 A Proposal to add Single Instruction Multiple Data Computation to the Standard Library ひとつのCPU命令で複数のデータを操作する、SIMD(Single Instruction Multiple Data)を抽象化したライブラリの提案。これは、スレッドを使用するタスク並列性に対して、データ並列性と呼ばれている分野の技術です。 この提案は、Boost.SIMDとしてBoostに提案される予定のライブラリが元になっています。Boost.SIMDについては、私が翻訳したスライド資料もあるので、合わせて参照してください(Boost.SIMDによる実用的なSIMDアクセラレーション)。 このライブラリは、SIMDを抽象化したpack型と、それに対して操作を行うaccumulate()やtransfor

    C++1y SIMDライブラリの提案 - Faith and Brave - C++で遊ぼう
    xmx3
    xmx3 2013/06/05
  • C++1y string_view - Faith and Brave - C++で遊ぼう

    N3069 string_view: a non-owning reference to a string, revision 3 Boost 1.53.0で入ったstring_refと同じく、所有権を持たない文字列クラスの提案。 このクラスは、char配列に対してsubstr()やfind()といったメンバ関数を、stringへの変換コストなしに呼び出すのに使用できます。 const char s[] = "Hello World"; // char配列の部分文字列を取得 string_view view = string_view(s).substr(6, 5); for_each(view.begin(), view.end(), [](char c) { cout << c; }); // 「World」が出力される string_viewはbasic_string_view型のt

    C++1y string_view - Faith and Brave - C++で遊ぼう
    xmx3
    xmx3 2013/06/05
  • Boost.uBLAS 固定次元ベクトル - Faith and Brave - C++で遊ぼう

    Boost.uBLASには任意次元のベクトルしかないと思っていましたが、boost::ublas::c_vectorという固定次元ベクトルクラスがありました。 c_vectorは、内部的には固定長の組み込み配列です。フリーストアは使いません。 #include <iostream> #include <boost/numeric/ublas/vector.hpp> namespace ublas = boost::numeric::ublas; int main() { ublas::c_vector<double, 2> v; v[0] = -1; v[1] = 1; ublas::c_vector<double, 2> u; u[0] = 1; u[1] = -2; // 内積を求める double result = ublas::inner_prod(v, u); std::cout

    Boost.uBLAS 固定次元ベクトル - Faith and Brave - C++で遊ぼう
    xmx3
    xmx3 2013/05/01
  • フリーストアを使わない可変長配列 - Faith and Brave - C++で遊ぼう

    static_vector using aligned_storage static_vector: fixed capacity vector update ソースコード: http://svn.boost.org/svn/boost/sandbox/varray/ 現在、BoostのSandbox上で、フリーストア(ヒープ)を使わない可変長配列の開発が進められています。 このコンテナは、テンプレートパラメータで決定した容量に基いて、静的なサイズの配列を内部的に持ち、その配列に対して配置newすることで可変長配列を実現します。 使い方は以下のようになります。 #include <iostream> #include <boost/container/varray.hpp> int main() { // intの可変長配列を定義。最大要素数は3 boost::container::var

    フリーストアを使わない可変長配列 - Faith and Brave - C++で遊ぼう
    xmx3
    xmx3 2013/02/09
  • boost::string_ref - Faith and Brave - C++で遊ぼう

    部分文字列に対する操作で、以下のような処理をよく書くと思います。 #include <string> std::string extract_part(const std::string& str) { return str.substr(2, 3); } int main() { if (extract_part("ABCDEFG").front() == 'C') { ... } } std::stringのメンバ関数を使いたいからchar配列からstd::stringに変換し、部分文字列を得るためにsubstr()メンバ関数を使っています。 しかしそのためにstd::stringの一時オブジェクトができてしまうので、効率はよくありません。 Boost 1.53.0から、このような場合に使用するstring_refというクラスが導入されました。これは以下のように使用します。 #incl

    boost::string_ref - Faith and Brave - C++で遊ぼう
    xmx3
    xmx3 2013/02/09
  • 優先順位付き大小比較 - Faith and Brave - C++で遊ぼう

    優先順位付きでoperator<()を定義するにはどうすればいいでしょうか。 Windowsのエクスプローラで言うところの、「ファイル種別順に並べて、同じファイル種別のものはファイル名順に並べる」というようなものです。 これは、std::tupleのoperator<()をそのまま使えばできます。クラスのメンバ変数をタプル化してstd::tupleの比較演算子を使います。 #include <iostream> #include <string> #include <vector> #include <algorithm> #include <tuple> struct File { std::string type; std::string name; File(const std::string& type, const std::string& name) : type(type),

    優先順位付き大小比較 - Faith and Brave - C++で遊ぼう
    xmx3
    xmx3 2013/01/25
  • 浮動小数点数と整数のstrong typedef - Faith and Brave - C++で遊ぼう

    整数と浮動小数点数のstrong typedefは頻繁にほしくなるので、それ用のクラスを作りました。 Effective C++読書会での発表(「Template <Programming> - テンプレートとは何か」)にも含まれていたやつです。 浮動小数点数用のtagged_realクラステンプレートと、整数用のtagged_intクラステンプレートがあり、それらには第1テンプレート引数として浮動小数点数/整数の型、第2テンプレート引数には用途に応じたタグを指定します。 テンプレートパラメータの異なるクラステンプレートは別な型と見なされるので、別な用途間の暗黙の型変換を自動的に禁止するためにタグを使用しています。 以下は、tagged_realの例として、角度の2つの表現、ディグリとラジアンそれぞれに対して型付けを行っています。get()メンバ関数を使用すれば、生の値が参照できます。 /

    浮動小数点数と整数のstrong typedef - Faith and Brave - C++で遊ぼう
    xmx3
    xmx3 2012/12/16
  • 「プログラミングの魔導書」の情報公開 - Faith and Brave - C++で遊ぼう

    http://longgate.co.jp/products.html 弊社、株式会社ロングゲートで、プログラミング雑誌を作るというプロジェクトが進行しています。 書創刊の目的は、プログラミングの入門記事が巷に溢れる今、プログラマのさらなる成長のため情報発信を行い、業界全体の技術力を向上させることです。 雑誌といっても、記事の質を保つために不定期刊行としていることから、実際には雑誌ライクな書籍となります。 書籍名は「プログラミングの魔導書〜Programmers' Grimoire〜」です。 創刊号となる今回のテーマは、サブタイトルにも含まれている「C++」です。全ての記事がプログラミング言語C++に関するものとなっています。 Vol.1のテーマをC++としたのは奇をてらったものではありません。 C++は習得の難しい言語と言われておりますが、近年はBoost C++ Librariesに

    「プログラミングの魔導書」の情報公開 - Faith and Brave - C++で遊ぼう
    xmx3
    xmx3 2010/06/08
  • BoostのVisual Studio Debugger Visualizers - Faith and Brave - C++で遊ぼう

    Visual Studioには2005からDebugger Visualizersという機能がこっそり入っていて そのおかげでSTLコンテナの状態がデバッグウィンドウで見やすくなっています。 デフォルトでDebugger Visualizersが有効になっているので、 vectorをデバッグしてみると以下のようにデバッグウィンドウに表示されます。 Debugger Visualizersを無効にした場合は以下のように表示されます。 これを見れば、Debugger Visualizersのおかげでどれだけ見やすくなっているかがわかると思います。 なんだかよくわからない値ではなく、要素数と要素がはっきりわかるようになっています。 Debugger Visualizersは、コンパイラに同梱されたライブラリのみに適用されるだけでなく ユーザー定義のライブラリにも適用することができます。 Visu

    BoostのVisual Studio Debugger Visualizers - Faith and Brave - C++で遊ぼう
  • C++0x メンバ初期化子の初期化順 - Faith and Brave - C++で遊ぼう

    C++0xのメンバ初期化子ですが struct Point { int x = 0; int y = 0; }; 初期化順はコンストラクタと同様、メンバ変数の定義順なので こんなこともできます。 struct Point { int x = 0; int y = x; };

    C++0x メンバ初期化子の初期化順 - Faith and Brave - C++で遊ぼう
    xmx3
    xmx3 2010/01/23
  • VC++10 Beta1さわってみた - Faith and Brave - C++で遊ぼう

    まだ30分くらいしかさわってないですけど、わかったことをつらつらと書いておきます。 ・インテリセンスはえーーーーーー ・TR1ライブラリはstd::tr1名前空間からstd名前空間に移動(std::tr1でも使える) ・<random>のdistributionクラスはC++0xの最新のクラス名に変更 (たとえば、uniform_int → uniform_int_distribution) ・_HAS_CPP0X、_HAS_RVALUE_REFERENCESって名前のdefineあった ・<system_error>のエラーコードが、C++0xでは以下のように定義されるが namespace std { enum class errc { address_family_not_supported, address_in_use, ... }; } VC++10では以下のように定義されてお

    VC++10 Beta1さわってみた - Faith and Brave - C++で遊ぼう
    xmx3
    xmx3 2009/06/04
  • <initializer_list>を暗黙にインクルード - Faith and Brave - C++で遊ぼう

    C++0xのRange-base for文を使用するには、std::Rangeコンセプトが必要なので<iterator_concepts>をインクルードする必要があります。 #include <iterator_concepts> int array[5] = { 1, 2, 3, 4, 5 }; for (int& x : array) // <iterator_concepts>をインクルードしないとこのfor文は使えない x *= 2; 言語の構文なんだからせめて<iterator_concepts>は暗黙にインクルードしてほしい、とも思いますが <iterator_concepts>はもインクルードするのでかなり大きいライブラリを Range-base for文を使用しない場合にもインクルードすることになり、コンパイル時間が長くなってしまいます。 これはC++のゼロオーバーヘッドル

    <initializer_list>を暗黙にインクルード - Faith and Brave - C++で遊ぼう
    xmx3
    xmx3 2009/05/14
  • 1