タグ

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

  • C++の勉強会を新しく企画しました - Faith and Brave - C++で遊ぼう

    cppmix.connpass.com 「C++ MIX」という名前で、新しい勉強会を @okdshin さんと企画しました。 休日に勉強会開催をするのはパワーがすごく必要でたいへんなので、いまのところ継続性を重視して平日夜に2時間程度の開催ということにしています。 Boost.勉強会は、勉強会の名前でBoostネタにしばられてしまう、ということが長い間指摘されていたこともあり、今回Boost.勉強会がもともと意図していた「C++周辺の勉強会」であることがわかる名前にしてあります。

    C++の勉強会を新しく企画しました - Faith and Brave - C++で遊ぼう
    nfunato
    nfunato 2018/11/05
  • C++11での自作アロケータに必要な最小コード - Faith and Brave - C++で遊ぼう

    C++11では、std::allocator_traitsというアロケータアクセスの中間インタフェースが用意されたおかげで、自作アロケータに必要な実装がだいぶ減りました。 自作アロケータに必要な最小コードは、以下のようになります。 要素型value_type 特殊関数(デフォルトコンストラクタ、コピーコンストラクタ、ムーブコンストラクタ) 別な要素型のアロケータを受け取るコンストラクタ allocate()メンバ関数。(hintパラメータはあってもなくてもいい) deallocate()メンバ関数 operator==とoperator!= サンプルコード: #include <new> template <class T> struct MyAllocator { // 要素の型 using value_type = T; // 特殊関数 // (デフォルトコンストラクタ、コピーコンスト

    C++11での自作アロケータに必要な最小コード - Faith and Brave - C++で遊ぼう
    nfunato
    nfunato 2017/04/01
    "allocator"
  • C++1z shared_ptrの配列対応 - Faith and Brave - 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* p = p1[0]; shared_ptr<T[ ]>はstd::vector<shared_ptr<T>>と比べて、実装として参照カウンタがひとつで済みます。そのため、空間とパフォーマンスはshared_ptr<T[ ]>の方が優れています。 この配列では、以下のような仕様の更新・追加があります: コンストラクタが配列も受け取れるような仕

    C++1z shared_ptrの配列対応 - Faith and Brave - C++で遊ぼう
  • C++1z 標準イテレータ全般とarrayの変更操作にconstexprを追加 - Faith and Brave - C++で遊ぼう

    C++1zでは、以下の機能にconstexprが付きます。 <iterator> std::advance()関数 std::distance()関数 std::next()関数 std::prev()関数 std::reverse_iteratorクラスのメンバ関数、非メンバ関数すべて std::move_iteratorクラスのメンバ関数、非メンバ関数すべて コンテナに対するstd::begin()、std::end()関数 コンテナに対するstd::rbegin()、std::rend()関数 配列に対するstd::rbegin()、std::rend()関数 std::initializer_listに対するstd::rbegin()、std::rend()関数 std::crbegin()、std::crend()関数 <array> std::arrayの以下のメンバ関数 be

    C++1z 標準イテレータ全般とarrayの変更操作にconstexprを追加 - Faith and Brave - C++で遊ぼう
  • C++1z 文字列検索アルゴリズム - Faith and Brave - C++で遊ぼう

    C++1zでは、文字列内の文字列を高速に検索するためのアルゴリズムとして、「ボイヤー・ムーア法 (Boyer-Moore)」と「ボイヤー・ムーア・ホースプール法 (Boyer-Moore-Horspool)」が導入されます。 これは、既存のstd::search()アルゴリズムを拡張する形で行われ、検索アルゴリズムを外部から指定するためのパラメータが追加されます。 #include <iostream> #include <string> #include <algorithm> #include <functional> int main() { // ボイヤー・ムーア法で、文字列内の特定文字列を検索 const std::string corpus = "…"; // 検索対象 const std::string pattern = "…"; // 対象の中に見つけたい文字列 auto

    C++1z 文字列検索アルゴリズム - Faith and Brave - C++で遊ぼう
  • C++1z なんでも代入できるanyクラス - Faith and Brave - C++で遊ぼう

    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 なんでも代入できるanyクラス - Faith and Brave - C++で遊ぼう
  • C++1z インクルードするファイルが存在するかを確認する__has_include - Faith and Brave - C++で遊ぼう

    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++1z インクルードするファイルが存在するかを確認する__has_include - Faith and Brave - C++で遊ぼう
  • C++のコンパイルエラー爆発を競うコンテスト - Faith and Brave - C++で遊ぼう

    Results of the Grand C++ Error Explosion Competition 少し前に、C++のコンパイルエラーの長さを競うコンテストが開催されていました。 受賞のカテゴリは2つあり、ひとつめは最小コードで最大のコンパイルエラーを出した人、もうひとつは芸術的な評価による受賞です。 最小コードで最大のコンパイルエラー この部門で優勝したのはEd Hanwayさんという方で、ソースコード量に対して59億倍のコンパイルエラーメッセージを出力したそうです。 それには、自身を2回インクルードするという手法が使われていたそうです。 #include ".//.//.//.//jeh.cpp" #include "jeh.cpp" 次点として、インクルードに後方参照を使用した、7億9千万倍のコンパイルエラーを出力するコード: #include "set>.cpp" #incl

    C++のコンパイルエラー爆発を競うコンテスト - Faith and Brave - C++で遊ぼう
    nfunato
    nfunato 2016/04/09
  • 波カッコ初期化のススメ - Faith and Brave - C++で遊ぼう

    このエントリは、C++11 Advent Calendar 2011の参加記事です。 今回は、C++11の統一初期化記法(Uniform Initialization)を使用したスタイル改善を紹介します。 統一初期化記法とは まず統一初期化記法というのは、コンストラクタの呼び出しを、関数呼び出しで使用する丸カッコだけでなく、Cからあった集成体初期化の波カッコも使えるようにしよう、というものです。 struct X { X(int a, double b, const std::string& c) {} }; X x1(1, 3.14, "hello"); // これまでの初期化構文 X x2{1, 3.13, "hello"}; // C++11で追加された初期化構文 初期化子リストとの統一 C++11では、ユーザー定義型でも配列の初期化構文を使えるようにするためにinitializer

    波カッコ初期化のススメ - Faith and Brave - C++で遊ぼう
  • C++0x - Template Aliases - Faith and Brave - C++で遊ぼう

    template + usingを使用して型名を付けられる template <class T> using Vec = vector<T>; Vec<int> v; template <int Size> using int_array = array<int, Size>; int_array<3> ar = { 3, 1, 4 }; typedefの代わりとしても使える using uint = unsigned int; 「Typedef Templates」「Generalized Typedefs」とも呼ばれる C++0x言語拡張まとめ

    C++0x - Template Aliases - Faith and Brave - C++で遊ぼう
    nfunato
    nfunato 2015/09/22
    "template"
  • C++1y - optionalの提案 - Faith and Brave - C++で遊ぼう

    C++1yでは、boost::optionalをベースとしたクラスが提案されています(元々TR2で導入しようと考えられていた)。提案者は、Boost.Optional作者のFernando Cacciolaさん。 このクラスは、intだったら-1を無効値とし、ポインタだったらNULLを…といったプロジェクトの決め事による無効値ではなく、型で無効値を表現するのに使用します。 optional<int> x = 3; // 有効値を代入 x = nullopt; // 無効値にする この提案でのboost::optionalとの相違点は、大きなところでは以下になります: 無効値はnullopt。Boostはnone。 constexpr対応 入出力ストリームの演算子を提供しない emplaceによる構築。Boostではin_place()関数。 入出力ストリームを提供しないのは、現状その振る舞

    C++1y - optionalの提案 - Faith and Brave - C++で遊ぼう
  • C++0xの言語拡張まとめ(※随時更新) - Faith and Brave - C++で遊ぼう

    C++0xの概要はこちら ・Angle bracket テンプレートの連続した山カッコの問題の解決 ・初期化子リスト ユーザー定義のクラスで配列のような初期化構文を実装可能になる ・Uniform initialization コンストラクタの構文と初期化子リストの構文が一様になる ・デリゲーティング・コンストラクタ コンストラクタから他のコンストラクタを呼び出せる ・auto 型推論 ・記憶クラス指定子としての auto の削除 autoキーワードの意味が変更になるため、下位互換がなくなる ・decltype sizeofの型版 ・Template Aliases テンプレートを使用して型の別名を付けることができる。いわゆるtemplate typedef ・拡張sizeof 構造体/クラスのメンバをインスタンス化せずにsizeofすることが可能になる ・nullptr ヌルポインタを表

    C++0xの言語拡張まとめ(※随時更新) - Faith and Brave - C++で遊ぼう
  • C++14標準ライブラリの小さな変更 その5 - Faith and Brave - C++で遊ぼう

    その1、その2、その3、その4に引き続き、C++14の標準ライブラリに入った小さな変更を紹介していきます。 error_categoryにデフォルトコンストラクタを追加 std::error_categoryクラスのコンストラクタに、デフォルトコンストラクタを追加しました。 constexpr error_category() noexcept; // (1) C++14 error_category(const error_category&) = delete; // (2) 単なる記載忘れです。 future/shared_futureの時間指定待機に、例外の仕様を追加 std::future::wait_for() std::future::wait_until() std::shared_future::wait_for std::shared_future::wait_unti

    C++14標準ライブラリの小さな変更 その5 - Faith and Brave - C++で遊ぼう
    nfunato
    nfunato 2015/03/27
  • C++1y 多相アロケータの提案 - Faith and Brave - C++で遊ぼう

    N3525 Polymorphic Allocators C++11現在の標準アロケータであるstd::allocatorは、コンパイル時にアロケータが管理する型を決定するから使いにくい。なのでアロケータにType Erasureを使ってインタフェースを改善しよう、というのがこの提案。 具体的には、polymorphic_allocatorとmemory_resourceという、大きく2つのクラスを用意する。使い方: // 固定サイズアロケータ。 // 抽象クラスであるmemory_resourceを継承して実装する class FixedBufferResource : public memory_resource { void *m_next_alloc; std::size_t m_remaining; public: FixedBufferResource(void *buffer

    C++1y 多相アロケータの提案 - Faith and Brave - C++で遊ぼう
    nfunato
    nfunato 2014/08/23
  • C++14でのreturnとreturn (…)の違い - Faith and Brave - C++で遊ぼう

    C++14で導入されるdecltype(auto)を使うと、returnとreturn (…)で戻り値の型が変わる。前者は値、後者は参照となる。 decltype(auto) f() { static int value = 3; return value; } decltype(auto) g() { static int value = 3; return (value); } int main() { int f_result = f(); int& g_result = g(); } 参照 C++11/14 and return( … ) vs return - StackOverflow C++14 通常の関数の戻り値型を推論

    C++14でのreturnとreturn (…)の違い - Faith and Brave - C++で遊ぼう
    nfunato
    nfunato 2014/06/11
  • C++Now! 2013の翻訳ページを更新 - Faith and Brave - C++で遊ぼう

    C++Now! 2013 - boostjp zakさんが、以下の翻訳を追加してくれました。 C++11とBoostを利用したマルチスレッディング モダンなC++向けのデータ分散サーヴィス(DDS: Data Distribution Service)の標準化 メンバーアクセス演算子のオーヴァーロード Haskellの力でMPLを強化しよう Boost.AsioとBoost.Serialization: オブジェクト受け渡しのデザインパターン C++Now 2014の準備 静的型付け言語における、動的で再帰的なヘテロ型 Projucer: C++とLLVM JIT エンジンを利用したライブコーディング

    C++Now! 2013の翻訳ページを更新 - Faith and Brave - C++で遊ぼう
  • GADTs使ってみた - Faith and Brave - C++で遊ぼう

    このエントリは、Haskell Advent Calendar 2011の参加記事です。 今回は、HaskellのGHC拡張であるGADTs(Generalized Algebraic Data Types : 一般化代数データ型)を調べて使ってみたという内容を書いてみました。 最初に、GADTsはGHC拡張なので、使用するには以下のようにして拡張を有効にする必要があります: {-#LANGUAGE GADTs #-} まずは構文的な違いを、Maybeを例にして見てみましょう。 通常の代数データ型では、Maybeは以下のように書きます: data Maybe a = Nothing | Just a GADTsでは以下のように書きます: data Maybe a where Nothing :: Maybe a Just :: a -> Maybe a 通常の代数データ型では、データコンス

    GADTs使ってみた - Faith and Brave - C++で遊ぼう
  • 1