読者です 読者をやめる 読者になる 読者になる

C++

C++ では void* から他のポインタ型へ暗黙的に変換できない

C++

今まで知らなかったので覚書。 C++ では void* 型から他のポインタ型へ暗黙的に変換することはできない。 なので、次のようなコードはエラーになる。 void* vp; // error: cannot initialize a variable of type 'int *' with an lvalue of type 'void *'; i…

ユーザ定義リテラル(と Sprout)を利用してテンプレート引数に float 値を渡す

C++

さて、テンプレート引数には int 型等の整数値を直接渡すことはできますが、float 値を直接渡すことはできません。 // こういう風に float 値を受け取ることはできない template<float F> struct X{ ... }; こういう場合、std::ratio みたいに分子と分母に分けて整数</float>…

C/C++ で予約済み識別子をシンタックスハイライトするプラグインつくった

他人の書いた C/C++ のコードを見ているとあまりにも予約済み識別子を無視してコードを書いているものが多いので、ついカッとなってつくった。 プラグイン osyo-manga/vim-cpp-syntax-reserved_identifiers NeoBundle 'osyo-manga/vim-cpp-syntax-reserved_i…

C++11 以降で using を使って配列型を別名で定義

C++

Twitter でみかけたんですが、こういう使い方もできるんだなーと。 C++03 では以下のように typedef を使って配列型を別名で定義することができます。 // int[5] の配列を int5 という名前で定義 typedef int int5[5]; int5 members = {0, 1, 2, 3, 4}; 関数…

C++ のライブラリを読むときに見るところ

C++

そこまで頻繁に読んでるわけではないのですが、たまーに C++ のライブラリを読んだりしています。 そんな時にわたしが特に注意している点を簡単にまとめて見ました。 予約済み識別子を意識してるか C++ では以下の条件を満たす名前は将来的に予約語になる可…

clang の定義済みマクロを取得する

C++

clang の定義済みマクロを取得したい場合、次のコマンドで出力する事ができます。 $ clang -dM -E -x c++ /dev/null [出力結果] #define _GNU_SOURCE 1 #define _LP64 1 #define __ATOMIC_ACQUIRE 2 #define __ATOMIC_ACQ_REL 4 #define __ATOMIC_CONSUME 1 …

std::weak_ptr について軽く調べてみた

C++

std::weak_ptr について軽く調べてみた。 C++ のスマートポインタまわりの知識は全然なかったりする。 [std::weak_ptr] std::shared_ptr が参照カウントを使用してオブジェクトの所有権を管理するのに対して、std::weak_ptr は所有権を持たずにオブジェクト…

C++17 で名前付き引数を書いてみた 〜完全版〜

C++

C++17 で実装されているらしい、user defined literals の機能を使って、C++17 で名前付き引数を書いてみた。 ちなみに不完全版はこっち。 C++17 で名前付き引数書いてみた。C++17 だとこういうこともできる http://t.co/sqoMmQbCGP— バンビちゃん@実際偽物…

C++ で末尾に自動で ; をつけるような Vim script 書いてみた

最初は lexima.vim で設定してみたんですが、うまくいかなかったので雑スクリプト書いた。 とりあえず、insert mode を抜けた時に発動するようにしています。 augroup cpp-auto; autocmd! " 末尾が " ' ) の場合に ; を追加する autocmd InsertLeave * \ if …

C++14 以前で関数テンプレートを変数や関数に渡すときにテンプレート型を明示化するのを回避する

C++

前回、C++14 で多相ラムダを使って回避する方法を書いたんですが、ついでに C++14 以前の回避方法も書いてみる。 と、いっても単に関数オブジェクトにするだけですが。 // template<typename T, typename U> // auto // plus(T a, U b){ // return a + b; // } // 関数ではなくてクラ</typename>…

C++03 で 関数ポインタ型をわかりやすく定義する

C++

さて、C++03 時代に関数ポインタ型を定義する場合は、 // int func(int, int); を保持する // func_type という名前の関数ポインタ型の定義 typedef int(*func_type)(int, int); みたいに定義する必要があります。 しかし、上のコードを見てもわかるとおり、…

C++ で std::ignore を使用して std::tie() で一部の値を受け取らないようにする

C++

std::tie() を利用すると std::tuple の値を複数の変数で一度に受け取る事ができます。 auto calc(int a, int b){ return std::make_tuple(a + b, a - b, a * b, a / b); } int a, b, c, d; std::tie(a, b, c, d) = calc(6, 2); [一部の値のみ受け取る] std:…

C++14: Single quotation mark as digit separator

C++

数値リテラルの任意の位置にシングルクオート(') を記述する事ができるようになる機能です。 巨大な数値を定義する場合に区切りとして使用する事ができます。 [Example] // 数値が大きい場合 ' をつけて可読性を上げる auto n = 512'3981'9652; // Binary li…

C++14: Generic lambdas

C++

C++11 で実装されたラムダ式の引数に auto が使用できるようになりました( いわゆる多相ラムダと呼ばれる機能。 これは template 引数と同様に引数型を抽象化することができる機能です。 // auto を使用することでどんな型でも受け取る事ができるラムダ式を…

C++14: Variable templates

C++

Variable templates は定数を任意の型で定義する事ができるようになる機能です。 以前の書き方では πなどの定数を任意の型で使用できるようにする場合、 template<typename T> struct PI{ static const T value; }; template<typename T> const T PI<T>::value = T(3.141592653589793238</t></typename></typename>…

C++14: Binary literals

C++

数値の先頭に 0b または 0B とつけることでその数値が2進数表記として扱われるようになります。 [Example] int n = 0b01001101; // => 77 int m = -0b00101100; // => -44 16進数示す 0x などと同じような使い方をします。 [実装コンパイラ] Clang 2.9 GCC 4…

C++ のオレオレ static_if を github で公開してみた

C++

とりあえず Travis CI の動作確認も兼ねて、なにかしら github で公開してみたかったので以前書いた static_if を github にあげてみた。 コードの質はおいておいて、こういう雑なのはどんどん公開していきたいですねぇ。 static_if github:https://github.c…

C++14 の機能まとめ(予定地)

C++

最近、C++ に全然触れていないので一日一個ずつぐらいのペースで取り上げていこうかなーと思います。 とりあえず、予定地だけほそぼそと書いていきます。 C++14 の機能 Binary literals Generic lambdas Variable templates Single quotation mark as digit …

std::default_delete を特殊化

C++

昨日の続き。 default_delete を特殊化する方がよいかもー、みたいな発言があったので試してみた。 [コード] #include <memory> #include <iostream> struct X{ friend void X_deleter(X*); X(int value) : value(value){} int value; private: ~X(){}; }; void X_deleter(X* x</iostream></memory>…

カスタムでリターを使用するユーザ定義型に対して std::unique_ptr を特殊化する

C++

そんな話が Lingr の C++ 部屋で出ていたので。 // 毎回カスタムデリータを設定するのが手間 std::unique_ptr<X, decltype(&X_deleter)> xp(new X(42), &X_deleter); // こう書けるようにしたい // std::unique_ptr<X> xp(new X(42)); [コード] #include <memory> #include <iostream> struct X{ friend voi</iostream></memory></x></x,>…

C++ のプロジェクトを Travis CI + github で自動テストする

C++

以下のページを参考にしてやってみました。 Travis CI で最新の gcc を使って自動テスト - sorry, uninuplemented: Travis CIを使ってみた: GitHubのレポジトリにバッジを貼りたかったから 実験用のプロジェクトをつくる とりあえず、最小限のファイルだけ用…

C++14 で static_if 書いてみた

C++

上げるの忘れてた。 generic lambda を使っていい感じに static_if を書いてみました。 ソース #include <iostream> template<typename Then, typename Else> auto static_if(std::integral_constant<bool, true>, Then then, Else else_){ return then; } template<typename Then, typename Else> auto static_if(std::integral_constant<bool, false>, T…</bool,></typename></bool,></typename></iostream>

LLVM 3.6 がリリース

最近、めっきり追ってないんですが LLVM 3.6 がリリースされました。 ダウンロードやリリースノートは下記を参照してください。 LLVM Project Blog: LLVM 3.6 Release donwload LLVM 3.6 Release Notes — LLVM 3.6 documentation Clang 3.6 Release Notes — …

range-based for で固定回ループ

C++

元ネタ:本の虫: range-based forで固定回ループ 雑に書いてみた。 コード #include <iostream> #include <utility> #include <array> template<std::size_t... Index> std::array<std::size_t, sizeof...(Index)> range_impl(std::index_sequence<Index...>){ return {{ Index... }}; } template<std::size_t N> auto range = range_impl(std::make_…</std::size_t></index...></std::size_t,></std::size_t...></array></utility></iostream>