C++

C++ 関連の vim 逆引きリファレンスのページをつくっている

この記事は Vim Advent Calendar 2013 54日目の記事になります。 『C++ のコード補完プラグインは種類が多いのでまとめたほうがよい』みたいな意見があったのでそれらをまとめるついでに書いてみました。 まぁ前からそういうページはほしいと思っていたので…

libclang の Python binding を使用する 〜 Index 編〜

前回は Config に関する記事を書きました。 今回は Index 周りについて簡単に書きます。 libclang では Index を使用してソースコードをパースし、TranslationUnit の生成を行います。 [test.cpp] struct X{ int value1 = 0; float value2 = 0.0f; }; int ma…

Vim Advent Calendar 2013 : Vim で libclang を使用した C++ の便利プラグインをつくった

この記事は Vim Advent Calendar 2013 48日目の記事になります。 Vim Advent Calendar 2013 の記事を書きたい人は明日すぐに書けますよ!! Vim Advent Calendar 2013 さて、今回の記事なのですが、少し前から Clang の libclang を使用したプラグインを作成…

const auto p = &x; でハマった

C++

次のように const auto でポインタを受け取った場合にちとハマったので覚書。 [ソース] #include <iostream> struct X{ void print(){ std::cout << "X::print();" << std::endl; std::cout << value << std::endl; } void print() const{ std::cout << "X::print() co</iostream>…

C++ (fork) Advent Calendar 2013 : C++ で型推論を活用する

C++

この記事は C++ (fork) Advent Calendar 2013 の 21日目の記事になります。 なんとなく書きたいことがあったので突発的に登録したんですが、周りが割りとガチで戦々恐々としています。 そんな C++ (fork) Advent Calendar 2013 ですが、今回は軽めの記事にな…

C++14 の Single quotation mark as digit separator を使ってみた

そういえば、Clang で既に実装されていたなーと思って試してみました。 [ソース] #include <iostream> int main(){ // 任意の場所で ' をおける int n = 1'000'000; int m = 1'23'456'7; std::cout << n << std::endl; std::cout << m << std::endl; // 10進数以外も i</iostream>…

C++ Advent Calendar 2013 前編 - Vim で C++ のコーディングを行う

この記事は C++ Advent Calendar 2013 の 19日目の前編の記事になります。 本記事は 2011 年に書いた Vim で C++ のコーディングを行うなら知っておきたい10のこと の 2013 年版になります。 2013 年版といいつつ全然 10個じゃないんですが…。 えー Vim 本体…

C++ Advent Calendar 2013 後編 - 構文解析ツールとして Clang を使用してみる

この記事は C++ Advent Calendar 2013 の 19日目の後編の記事になります。 さて、Clang なのですが C++er では知らない人はいないと思います。 Clang とは LLVM をバックエンドとした C++ のコンパイラです。 最近では Clang が C++14 の機能を全て実装して…

marching.vim に wandbox を使用したコード補完の実装を追加してみた

何かと話題の wandbox なのですが、その wandbox の API を利用したコード補完の実装を marching.vim に追加してみました。 Vim から wandbox へ補完を行うコードを投げ、wandbox 側でコード補完の処理を行ってもらう事によりローカルに Clang の環境がなく…

Boost.Predef つかってみた

リリース前から気になっていたんですが、すっかり忘れていたので簡単に試してみました。 [ソース] #include <boost/config.hpp> #include <boost/predef.h> #include <iostream> int main(){ std::cout << BOOST_COMPILER << std::endl; #if BOOST_OS_WINDOWS std::cout << "OS is Windows." << std::endl</iostream></boost/predef.h></boost/config.hpp>…

C++14 で Boost.Fusion の invoke と make_fused 書いてみた

C++

C++14 で Boost.Fusion の invoke と make_fused を簡単に書いてみました。 [ソース] #include <tuple> #include <array> #include <utility> #include <iostream> template< typename F, typename Seq, std::size_t ...Indexes > constexpr auto invoke_impl( F func, Seq const& seq, std::i</iostream></utility></array></tuple>…

C++ で zip関数を書いてみた

C++

元ネタ zip - gist 久しぶりにメタプログラミングらしいメタプログラミングをした - 本の虫 最近、あまり C++ 触れられてないのでリハビリがてら書いてみた。 [ソース] #include <array> #include <tuple> template<std::size_t ...Indexes> struct index_tuple{}; template< std::size_t Start, st</std::size_t></tuple></array>…

LLVM 3.4 は12月23日にリリース予定

The LLVM Compiler Infrastructure LLVM 3.4 のリリーススケジュールがトップページに記述されていました。 リリースまでのスケジュールは以下の通りです。 11月19日 - Phase I Testing 11月25日 〜 12月01日 - Fix bugs from Phase I 12月02日 〜 12月08日 …

Boost 1.55.0 がリリース

Boost 1.55.0 がリリースされました。 Version 1.55.0 - boost Boost 1.55.0 では Predef が新しいライブラリとして追加されます。 Predef OS やアーキテクチャなどのコンパイル環境を定義済みマクロで利用できる また、Visual Studio 2013 では既知のバグが…

C++14 の Generic lambda で bind1st 書いてみた

前回試したときは Generic lambda でキャプチャが出来なかったんですが、今回すべてが実装されたようなので再度試してみました。 [ソース] #include <iostream> template<typename F, typename T> auto bind1st(F func, T t){ return [=](auto... args){ return func(t, args...); }; } int plu</typename></iostream>…

LLVM/Clang 3.4(svn) に C++14 の機能(n3797)がすべて実装された

C++14 の仕様はあまり追えていないのですが、現在のドラフト(n3797)の提案はすべて svn に組み込まれたようです。 http://clang.llvm.org/cxx_status.html#cxx14 Generic Lambdas あたりも全部実装されたようなのでいろいろと遊んでみたい。 土日にでもビ…

marching.vim をいろいろと改良した

先日 Vim で C++ のコード補完を行うプラグインをつくったのですが、いろいろと改良しました。 キャッシング周りはだいぶマシになったんじゃなかろうかと。 [主な改良点] キャッシング周りの強化 バッファごとにキャッシングを保持するようにした 同期版の実…

Visual Studio 2013 を試してみた

C++

先日 Visual Studio 2013 がリリースされたということなので C++11 的な意味で試してみました。 Visual Studio 2013 では以下の C++11 の機能が新しく実装されました。 Non-static data member initializers Variadic templates Initializer lists Default t…

江添亮氏の C++11の参考書が公開された

C++

C++11参考書の公開:C++11の文法と機能 - 本の虫 と、いう事で以前から作成されていた参考書が github で公開されました。 すばらっ。 最近は C++ あんまり触れてないので復習がてら眺めてみようかなぁ。 あと Web からも閲覧できるように github に gh-page…

C++14 の Initialized lambda captures を試してみた

C++

Clang 3.4(svn) では既に実装されていたので軽く試してみました。 [ソース] #include <iostream> int main(){ int x = 4; auto y = [&r = x, x = x + 1](){ r += 2; return x + 2; }; std::cout << "x = " << x << " y = " << y() << std::endl; std::cout << "x = " <</iostream>…

C++14 の Generic lambdas で SFINAE その 2

C++

昨日書いたコードはあまり意味がなかったので簡単なラッパーを書いてラムダ式を多重定義で呼び出せるようにしてみました。 これなら SFINAE を使う意味も出てくるかな。 [ソース] #include <iostream> #include <string> template<typename F1, typename F2> struct overload_impl : F1, F2{ using F1::op</typename></string></iostream>…

C++14 の Generic lambdas で SFINAE

C++

まぁ Generic lambdas だと多重定義できないのでほとんど意味は無いのですが。 [ソース] #include <iostream> #include <type_traits> #include <string> int main(){ auto plus = [](auto a, auto b) ->decltype(a + b){ return a + b; }; std::cout << plus(1, 2) << std::endl; std::cout </string></type_traits></iostream>…

不動点コンビネータで C++14 の Generic Lambdas をつかってみた

C++

せっかくなので書いてみました。 [ソース] #include <iostream> // base code : http://d.hatena.ne.jp/iorate/20110729/1311949434 template<typename F> struct fix_result{ F f; template<typename ...Args> constexpr auto operator()(Args&&... args) const{ return f(*this, std::forward<Args>(args)</args></typename></typename></iostream>…

C++14 の Generic Lambdas で可変長引数

Clang 3.4(svn) で試してみました。 [ソース] #include <iostream> #include <string> int main(){ auto sum = [](auto x, auto&&... args){ for(auto&& n : {args...}){ x += n; } return x; }; std::cout << sum(1, 2, 3) << std::endl; std::cout << sum(std::string("homu"</string></iostream>…

Clang 3.4(svn) の Generic lambdas を試してみた

結構前に実装されたのですがやっとこさ試してみました。 とりあえず、簡単に。 [ソース] #include <iostream> #include <string> int main(){ auto twice = [](auto n){ return n + n; }; std::cout << twice(10) << std::endl; std::cout << twice(0.52) << std::endl; std::c</string></iostream>…

Clang を使用した非同期で C++ のコード補完を行うVimプラグインをつくった

この記事は Vim Advent Calendar 2012 316日目の記事になります。 ちなみによく Twitter とかで 『2012年と2013年の Vim Advent Calendar が並走するのか』 みたいな発言を見かけますが Vim Advent Calendar 2012 は11月末で終了します。 ですので、参加され…

LLVM/Clang 3.4(svn) に C++14 の機能がいろいろと実装されていた

実装されてしました。 C++98, C++11, and C++14 Support in Clang これで C++14 の機能は全部手が付けられたのかな。 (部分的ではあるけど)Generic lambdas ついに来たか…という感じ。 一応、ビルドはしたんですがまだ試してないのでちょっと触ってみたい…

Boost 1.55.0 のリリースノート(予定)

Version 1.55.0 - work in progress Predef OS やアーキテクチャなどのコンパイル環境を定義済みマクロで利用できる 新しいライブラリとして predef が追加されます。 predef はちょっと気になっていたライブラリなんですが、Boost に追加されるみたいですね…

clang 3.4(svn) に Variable templates が部分的に実装されていたので試してみた

clang 3.4(svn) に C++1y で実装される予定の Variable templates が部分的に実装されていたので少し試してみました。 C++1y では以下のようにコードを記述することができるみたいです。 [ソース] #include <iostream> #include <limits> #include <iomanip> #include <array> template<typename T> constex</typename></array></iomanip></limits></iostream>…

C++14 で副作用のある constexpr 関数

C++

今更ながら n3652 読んでいて驚いんたんですが C++14 だと次のように副作用のある constexpr 関数が定義できるようです。 [ソース] constexpr void increment(int& x){ ++x; } constexpr int func(int x){ int n = x; increment(n); increment(n); increment…