C++

C++ のラムダ式の引数型を推論する

C++

そういう話が Slack の C++ の会で出てたので簡単にラムダ式の引数型を取得するメタ関数を書いてみた。 #include <utility> template<typename... Args> struct parameter_pack{}; template<typename F, typename R, typename... Args> parameter_pack<Args...> args_impl(F, R(F::*f)(Args...) const); template<typename F> auto args(F f)->decltype(a</typename></args...></typename></typename...></utility>…

C++03 で has_xxx の実装

C++

久々に書いてみたら全然書き方覚えてなかったので覚書。 template<typename T> struct sfinae_helper{ typedef void type; }; template<typename T, typename U = void> struct has_xxx{ static bool const value = false; }; template<typename T> struct has_xxx<T, typename sfinae_helper<typename T::xxx>::type>{ static bool const value = tru…</t,></typename></typename></typename>

C++ の会に参加している

最近、主に Slack で活動してる C++ の会に参加してみました。 主に Slack で雑談でしてるだけなんですが、興味のある方はこちらから登録してください。 アクティブユーザが少なくて寂しい。

C++ の private メンバにアクセスする手段

C++

特に面白みもないんだけどメンバ変数のポインタがわかっていればアクセスすることは可能よね、と。 [コード] #include <iostream> struct X{ auto get_value_ptr(){ return &X::value; } private: int value = 42; }; int main(){ X x; // error // x.value; auto valu</iostream>…

LLVM/Clang 3.7 がリリース

いつの間にか 3.7 がリリースされていました。 リリースノートは以下の通り LLVM 3.7 Release Notes LLVM 3.7 documentation

Boost.TypeErasure のミニマム実装

その昔に書いたコードを発掘したので載せてみるなど。 このコードは Boost.TypeErasure がリリースされた頃に書いたので、現在の実装はまた別のものになっているかも知れない。 [コード] #include <iostream> #include <boost/any.hpp> template<typename Concept, typename T> struct adapter{ static void apply(bo</typename></boost/any.hpp></iostream>…

C++ で std::vector<派生クラス> から std::vector<基底クラス> に変換する

C++

さて、C++ では次のような std::vector<派生クラス> から std::vector<基底クラス> への 暗黙的な変換はできません。 struct base{ }; struct derived : base{ }; std::vector<derived*> ary; // base は derived の基底クラスなので変換を期待するが、こういう変換は</derived*>…

std::vector で参照を保持したい

C++

std::vector<T&> みたいに std::vector で参照値を保持したい事があると思いますが、これはコンパイルエラーになってしまいます。 この問題を回避したい場合は、C++11 で追加された std::reference_wrapper を利用する事ができます。 [コード] #include <vector> #includ</vector></t&>…

std::reference_wrapper の参照元に T 型の値を代入する

C++

std::reference_wrapper<T> は std::ref() 等で返ってくるクラスなんですが、参照元に T 型の値を代入するときにちょっと気になったので覚書。 さて、次のように std::reference_wrapper<int> で保持している参照元に対して整数を代入する場合、コンパイルエラーにな</int></t>…

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のレポジトリにバッジを貼りたかったから 実験用のプロジェクトをつくる とりあえず、最小限のファイルだけ用…