C++

無名構造体を名前付き tuple として使う

C++

例えばユーザ名,Eメール,IDの3つの値を一気に返したいとき,C++ では std::tuple が使えます. #include <string> #include <tuple> using std::operator""s; auto get_user() { // std::tuple<std::string, std::string, int> return std::make_tuple("Linda"s, "foo@bar.com"s, 17); // name, email, id</std::string,></tuple></string>…

可変長のパラメータパックのまま扱うのがだるい時は tuple で扱うのどうだろう

C++

C++11 から入った可変長テンプレート引数,便利ですがパラメータパックの扱いがとっつきにくいです. 下記のように一旦 tuple で受ければその後は std::tuple のインターフェースで受けて自由にできるので 良いんじゃないかという気がする. template<class... Args> void d</class...>…

今年気になった C++ ライブラリとかフレームワークを紹介する記事

C++

この記事は C++ Advent Calendar 2014 の17日目の記事です.前日は @yutopp さんの Boost.Spirit.X3のご紹介 - C++ Advent Calendar 2014(16日目) でした. 最近 Boost.Spirit と LLVM で言語をちまちまと書いているので,Boost.Spirit と LLVM で言語つくる…

C++ の web フレームワーク crow のコンパイル時処理

C++

最近,C++ の crow という薄いウェブフレームワークが出ました.特に要件は書いていないですが,C++11 以上が必須のモダンな設計で Python の Flask のような雰囲気で書けるのが売りらしいです. ipkn/crow CROW_ROUTE(app,"/hello/<int>") ([](int count){ if (c</int>…

boost::variant の visitor にラムダ式を使う

boost::variant は複数の方を入れられる型安全な union のようなコンテナで,次のように visitor パターンを使ってアクセスできます. Boost逆引きリファレンス > ユーザー定義型を扱える型安全な共用体 ですが,ちょっとした要素アクセスのために毎度 visit…

Uniform initialization で困るパターン(std::string)

C++

C++11 で,() でなく {} で初期化する統一初期化(Uniform initialization)が入った.普段はこれを使っているけれど,この間これで std::string でハマったのでメモ. std::string のコンストラクタの中には,char 型の値を一定回数繰り返すコンストラクタ…

僕は小数点数のパースがやりたかった

Boost.Spirit.Qi で定数リテラルのパースを行う処理を書くときに,小数点数と整数のパースでちょっと詰まった. qi::double_ | qi::int_ とすると 42 などの整数値も double 型でパースされてしまうし, qi::int_ | qi::double_ とすると,3.14 などの小数点…

'auto' 宣言の型を調べるプラグイン作った powered by momonga.vim #2.2

2/1 から 2/2 にかけて開催された @supermomonga さん主催の momonga.vim 2.2 に参加しました. 少人数でぐだぐだ雑談しながら作業する感じの会です. clang-type-inspector.vim つくった C++11 から auto を指定することで変数宣言の型を推論させることがで…

ジェネリックラムダをもっと手軽に書くためのマクロ

C++

ラムダのキャプチャは無くてはならないものだけれど,たいていの場合は [&] とかで済んでしまう.また,引数の型もジェネリックラムダの登場で,だいたい auto で済んでしまうようになったので,こんな感じで書けると良いなぁと思うようになった. std::vect…

C++14 の変数テンプレートで ::value を省く

C++

C++11 で template alias が入ったことにより,テンプレートメタプログラミングでよく出てくる,メタ関数を評価するための typename ::type を省略して直接型を取得するようなエイリアスが書けるようになりました. template<bool B, class T> using enable_if_ = typename st</bool>…

クラススコープの変数テンプレート

C++

クラススコープでは,変数テンプレートは静的なメンバ変数でしか使えない. struct X { // OK template<class T> static T hoge = T{}; // NG template<class T> T huga = T{}; }; なので,オブジェクトごとにメンバ変数テンプレートを持つということはできない. 少なくとも現</class></class>…

Boost.Variant が特定の型の値を保持していた時だけ処理を実行する

boost::variant が保持している値の型が特定の型の場合だけ○○するという処理が多いの,でラムダ式で処理を書けるようにした. apply<{期待する variant が保持する値の型}>({variant な変数}, {適用したい関数}) という感じに使う. #include <boost/variant/variant.hpp> #include <iostream> int</iostream></boost/variant/variant.hpp>…

Boost.Variant に型指定でアクセスしたい

boost::variant の要素にアクセスする場合,which() メンバ関数で boost::variant が保持している値の型を見てからアクセスするか static_visitor でアクセスするかの二択が普通だと思うけれど,「which() でアクセスするのはマジックナンバー増えるから嫌」…

boost::variant の型パラメータ数制限をオーバーした時の対処

boost::variant はテンプレートに書ける型の数がデフォルトで 20 に制限されている.この値は variant_fwd.hpp に定義されている BOOST_VARIANT_LIMIT_TYPES マクロで確認できる. 今回は制限の 20 を超える数の型を boost::variant に指定したくなったので…

2013年に書いた Vim プラグインその他まとめ

今年書いた Vim プラグインその他をリストアップしてみた. Vim プラグイン clever-split.vim 現在のウィンドウの縦幅や横幅,開くバッファの最大の桁数などを考慮して縦分割・横分割・新規タブの中から開き方を賢く選択肢てくれるプラグイン conflict-marke…

Boost.MPL で条件の分岐先の評価を遅延したい

Boost.MPL でテンプレートの評価を遅延するやり方が分かっていなかったので調べてみたメモ. 具体例で書く. ある正数からその正数以下の連番文字列を作り出すメタ関数を考える.例えば,5 を入力すると "12345" が得られるものとする.面倒くさいので,入力…

Boost.Spirit.Qi と Boost.Variant で簡単な電卓つくった

Boost.Spirit.Qi は今まで parse() とか phrase_parse() に直接パーサを渡すだけで簡単にパースできる場合にしか使っていなかったので,真面目に文法を定義してパースしてみた. 作ったのは,四則演算と括弧と対数関数と指数関数が使える簡単な電卓. Boost.…

Travis CI で最新の Clang (3.5) を使ってテストする

Travis CI は Github アカウントと連携してリポジトリに .travis.yml というファイルを置くことで Github に push したときに自動でテストを回して CI してくれるサービス. Travis で使われている Ubuntu 12.04 に入っているコンパイラは gcc 4.6 と clang …

Vim で C++ を書くときの逆引きリファレンス

この記事は C++ AdventCalendar 2013 の 10 日目の記事です. 本記事では Vim で C++ を書いている人を対象として,逆引きで Vim の機能やプラグインについて紹介していきます. すべてについて細かく書いているとキリが無いので,基本的な使い方とプラグイ…

C や C++ のコードを自動で整形する clang-format を Vim で

この記事は Vim Advent Calendar 269 日目の記事になります. きつねさんとおぼえる!Clang という本を読んでいて,clang 周りで色々役立ちそうなツールがあることを知ったので,その中でも C や C++ のソースコードを整形する clang-format というツールの …

C++ のソースコードの中に犬の顔文字が現れうることに気づいた

C++

int main() { (U'ω'); return 0; } このコードを g++ でコンパイルすると,件の行で statement has no effect と警告が出る.けれど実際は,プログラマを癒やす効果があるのでこの警告はコンパイラのバグだと思う.バグ報告したい.

Travis CI で最新の gcc を使って自動テスト

Travis CI にある gcc は現在 4.6 で,普通に使う分には申し分ないけれど,最新の C++ の機能を使っている場合,最新の gcc や clang でテストを実行する必要がある場合がある. Travis CI の VM は Ubuntu らしく,最新の gcc を利用したければ自分で apt …

Homebrew で最新の libc++ と clang をビルドする

追記(9/23) homebrew-versions に llvm34 というフォーミュラが入っているので,公式に最新の LLVM を入れるには,このフォーミュラを使ったほうが良い.このフォーミュラを使うと,インストールはサンドボックスの中に行われ,システムの clang と衝突しな…

続・文字型の可変長パラメータ引数を使ってコンパイル時に文字列を生成する

C++

char 型の可変長パラメータ引数を使ってコンパイル時に文字列を生成する の続き. まず,ワイド文字を全く考えていなかったので,std::basic_string のように文字型をテンプレートにしてみた. template< class CharT, CharT... Chars > struct basic_string…

テンプレートの部分特殊化の引数リストにかかる制約

C++

昨日文字列を表す型を書いていて,このコードがエラーになるのが引っかかった. template<class T, T... CS> struct S{}; template<int I, class T> struct X1; template<class T, T C, T... CS> struct X1<0, S<T, C, CS...>>{}; template<class T, int I, T... CS> struct X1<I, S<T, CS...>>{}; template<int I, class T> struct X2; template</int></i,></class></t,></class></int></class>

char 型の可変長パラメータ引数を使ってコンパイル時に文字列を生成する

C++

C++11 から可変長のテンプレート引数を取ることが出来るようになったので, template< char... Chars > struct string {}; というクラステンプレートをつくって文字列を可変長パラメータパックに突っ込むことを考えてみた. 例えば,"moudameda" という文字…

non-static data member initializer と初期化子リストの優先度

C++

C++11 からデータメンバ宣言場所で非静的メンバの初期化が出来るようになりましたが,この初期化は初期化子リストによる初期化が省略されたときのみ行われます. #include <iostream> struct X{ int const i = 42; X(){} // 初期化子リスト無し X(char) : i(-42){} // </iostream>…

type_traits と tuple を使ってコンパイル時 FizzBuzz

C++

#include <iostream> #include <type_traits> #include <tuple> struct fizz{ static char const value[ ]; }; char const fizz::value[ ] = "fizz"; struct buzz{ static char const value[ ]; }; char const buzz::value[ ] = "buzz"; struct fizzbuzz{ static char const value[ ]; }; c</tuple></type_traits></iostream>…

「constexpr 長いねん」に対するエディタ的回答

autocmd FileType cpp \ inoremap <expr> e getline('.')[col('.')-6:col('.')-2] ==# 'const' ? 'expr ' : 'e' これで conste まで打つと自動で constexpr に展開されるので,const とほとんど同じ手間で constexpr と打てる!やった!</expr>

unite-n3337 を作った

N3337 という,C++ の現行規格にもっとも近いドラフトがあり,今まで規格について調べたいときは N3337 の PDF ファイルを開いていました. しかし,いちいち開いて検索ワードを打ち込んで検索結果を1つずつ辿って…という作業が面倒だったので,unite.vim で…

constexpr 関数を書きやすくする RETURN マクロ

C++

C++11 では関数の戻り値型を後置する構文が新たに入りました. auto plus(int a, int b) -> int { return a+b; } C++ の型はテンプレートが絡むと長くなりがちなので,今までは戻り値型だけで改行したりテンプレートのデフォルト引数を使って戻り値型を定義…

Effective C++ 読書会 Vol.1 に行ってきた

C++

C++ の名著,Effective C++ の読書会パート1に行ってきました. 具体的には,Effective C++ の各項に沿って怖い人達が熱く語る感じの内容でした. 3項までしか進まなかったんですが,2時間ほどかなり濃い内容で楽しめました.id:uskz さんと id:Cryolite さ…

プリプロセス時標準入力

C++

IOCCC のネタを漁っていたら面白いものがあったのでパクってみた. #include <iostream> int main() { char str[] = "" #include "/dev/tty" ""; std::cout << str << std::endl; return 0; } コンパイル時に "Hello, world!"^Dと入力(^Dは Ctrl+D)してコンパイルし</iostream>…

可変個数のコンテナに適用できる zipWith のようなもの

C++

std::transform では1つのコンテナに対して所謂 map の操作を行えたり,2つのコンテナに対して所謂 zipWith を行えます.今回は C++11 で新たに導入された Variadic Templates を使って,対象となるコンテナの数を任意個になるように拡張してみました. temp…

インクルードガード用の neocomplcache スニペット

neocomplcache のスニペットには Vim script の式を使って展開する機能があります. c.snip snippet include_guard alias inc_guard prev_word '^' abbr #if !defined HOGE #define HOGE #endif #if !defined `toupper( substitute( expand("%"), "\\.", "_"…

生配列を std::array に変換する

C++

constexpr で扱えて,実行時の効率もよいデータ構造+アルゴリズム - 危ないRiSKのブログ コンパイル時に配列を結合する - iorateの日記index_tuple を使って constexpr な生配列から std::array への変換の処理をする配列を書いてみました. int main() { /…

Homebrewで最新のGCC 4.6.3 をインストールするためのパッチを書いてみた

こちらに置いています. https://github.com/rhysd/others/blob/master/gcc-4.6.0-to-4.6.3.patchインストール方法は Homebrewで最新のGCC ( gcc-4.6.2 ) をインストールするためのパッチを書いてみた と同じなので割愛. 以前この方法でgcc-4.6.2をインスト…

Boost.勉強会 #8 に参加しました

2/11に大阪で行われた Boost.勉強会 #8 に参加してきました. Boost.勉強会 #8 大阪 - boostjp前々からBoost.勉強会には興味があってぜひ参加したいと思っていたので,今回の勉強会は即参加を決めました. メンバ変数のメンバ関数内でのリソース管理 ( @cpp_…

Boost.Test でモックテストしてみた

先日のBoost.勉強会 #8 にて,id:heisseswasser さんの発表へのアキラさん( id:faith_and_brave )のツッコミで,Boost.Testでもモックテスト用のライブラリがあるという指摘がありました. どうやらドキュメントに載っていないらしいので,自分なりに調べて…

SONY Go For It: 2) の解答

C++

問題 http://www.sony.co.jp/SonyInfo/Jobs/newgrads/sus/q02.html i) の解答 factorial_int.cpp // FILE: factorial_int.cpp // AUTHOR: rhysd (http://d.hatena.ne.jp/rhysd/) // License: MIT license {{{ // Permission is hereby granted, free of char…

Vimのinsertモードで便利なC++コーディング用キーマップ

autocmd FileType cpp call MyCppMapping() function! MyCppMapping() inoremap <buffer><expr><CR> \ strpart( getline('.'), col('.')-2, 2 ) == "{}" ? \ "\<CR>\<C-o>k\<C-o>$\<CR>" : "\<CR>" inoremap <buffer>{ {}<Left> inoremap <buffer>( ()<Left> inoremap <buffer>() () inoremap <buffer><> <><Left> inoremap…</left></buffer></buffer></left></buffer></left></buffer></cr></cr></c-o></c-o></cr></cr></expr></buffer>

constexprな関数でコンパイル時にn乗根を求める

C++

とあるプログラムで,定数の3乗根を求めたいことがありました. どうせ求めるならこれからも使えそうなn乗根で,どうせならconstexprでということで,書いてみました.求め方としてはニュートン法を使っています.初期値さえ間違えなければニュートン法はか…

Homebrew で Boost 1.48.0 をインストールする

有名なC++準標準ライブラリ群Boostの最新版が先日出たので,それに対応させるパッチを書きました. じきに公式に対応するとは思いますが,(自分みたいに)待てない人もいるかもしれないので公開しておきます.インストール方法は others/boost-1_47_0-to-1_…

Homebrewで最新のGCC ( gcc-4.6.2 ) をインストールするためのパッチを書いてみた

最近Macのパッケージ管理システムを色々使ってみていて,その一環でHomebrewを使ってみたりなどしました. Homebrewにはgccのパッケージが見当たらなかったので検索してみたところ, homebrew-altというリポジトリに比較的新しめのgcc-4.6.0のFormulaがあり…

NeoComplCacheのスニペット補完用C++11スニペットを書いてみた

C++11が国際標準として承認され,これから徐々に広まっていくであろう予測されます.そこでVimの有名な補完プラグイン,NeoComplCacheのスニペットにC++11で新たに加わった range-based-for,ラムダ式,scoped enumeration を追加してみました.例えば.vimrc…

ふぃず!ばず!

C++

これからプログラミング・ソフトウェアの設定などの備忘録として適当に書いていきたいなとか思ってます.一次情報にあたればいいものはせいぜい参考URL程度に,バグ踏んだ時などは少々細かめに行く予定.テストがてら,こないだ書いたfizzbuzzを貼っておきま…