C++

C++14 で名前付き引数

C++

標準ライブラリでできる範囲で書いてみました。 [ソース] #include <tuple> template<typename T, typename Uniq> struct holder{ T value; operator T(){ return value; } holder& operator =(T t){ value = t; return *this; } }; template<typename T, typename Uniq, typename ...Args> T get(holder<T, Uniq>, Args... args){ return std::get</t,></typename></typename></tuple>

std::unique のデフォルトのデリータ

C++

std::unique のデフォルトのデリータは何なのか調べてみたら次のように定義されているみたい。 template< class T, class Deleter = std::default_delete<T> > class unique_ptr; template < class T, class Deleter > class unique_ptr<T[],Deleter>; と、いうことでデフォ</t[],deleter></t>…

std::unique_ptr のデリータをあとから設定する

C++

と、いうのが Lingr の C++ 部屋に貼られていたので覚書。 [ソース] #include <memory> #include <functional> #include <iostream> int main(){ auto p = std::unique_ptr<int, std::function<void(int*)>>{ new int{42}, std::default_delete<int>{} }; // deleter を設定 p.get_deleter() = [](int* p){ std::cout << "call d</int></int,></iostream></functional></memory>…

std::unique_ptr のデリータをあとから設定する

C++

と、いうのが Lingr の C++ 部屋に貼られていたので覚書。 [ソース] #include <memory> #include <functional> #include <iostream> int main(){ auto p = std::unique_ptr<int, std::function<void(int*)>>{ new int{42}, std::default_delete<int>{} }; // deleter を設定 p.get_deleter() = [](int* p){ std::cout << "call d</int></int,></iostream></functional></memory>…

Bugs Fixed in Visual Studio 2013 Update 3

C++

Bugs Fixed in Visual Studio 2013 Update 3 - Visual C++ Team Blog - Site Home - MSDN Blogs http://blogs.msdn.com/b/vcblog/archive/2014/08/04/bugs-fixed-in-visual-studio-2013-update-3.aspx 最近の Visual Studio 事情はよく知らないのだけれどだ…

C++ で簡単にアクセッサを書けるようにしたかったけど Non-static data members で auto が使えなくて死んだ

C++

class X{ int value_ = 42; public: auto value = accessor(this, &X::value_); }; みたいな感じで書きたかった。 [ソース] template<typename Class, typename T> struct accessor_impl{ Class* class_; T Class::* member; T operator ()() const{ return class_ ->* member; } void op</typename>…

LLVM 3.5 は08月25日にリリース予定

The LLVM Compiler Infrastructure Project LLVM 3.5 のリリーススケジュールがトップページに記述されていました。 リリースまでのスケジュールは以下の通りです。 7月21日: Branch for 3.5 release 7月21日〜27日: Testing Phase I 7月28日〜8月03日: Fix …

std::initializer_list には operator[] がない

C++

なんか前も言っていたような気がしないでもないんですが、std::initializer_list には operator[] が定義されてないんですね。 基本的には range-based for 使っているので気にならないんですが、この前ランダムアクセスしようと思ったらエラーになって面食…

Boost.ScopeExit 使ってみた

そういえば、使ったことがないので試してみた。 Boost.ScopeExit を使用すると『そのスコープを抜けるときの処理』を記述する事ができます。 例えば、スコープの最初の方に『最後に呼ばれる処理』みたいなことを定義する事ができます。 [ソース] #define BOO…

C++ で中身が同じ構造体を相互変換する

みたいな話が Lingr の C++ 部屋で出てた。 そういうことを実現したい場合は Boost.Fusion を使うのが現実的かな? (reinterpret_cast で無理やり変換してしまうという手が無いわけではないのだけれどさすがにアレ過ぎるので。 [ソース] // 構造が全く同じ…

ラムダオブジェクトを static 変数で保持する時の注意

C++

Lingr の C++ 部屋で話題になったのですが、参照キャプチャしたラムダを static 変数で保持するのは未定義の動作になることがあるので注意しましょうという話。さて、話題になっていたのは次のようなコードです。 void func(int const& i){ static auto f = …

LLVM 3.4.1 がリリース

少し前になるんですが LLVM 3.4.1 がリリースされました。 LLVM 3.4.1 Release Notes — LLVM 3.4 documentation LLVM Download Page

C++ における X(){} と X() = default; の違い

C++

Lingr の C++ 部屋で struct X{ X(){} }; と struct X{ X() = default; }; との違いはなんだろう、みたいな話で盛り上がっていたので覚書。 結論からいうと以下のような感じらしい。 http://lingr.com/room/cpp/archives/#message-19090582 要は X(){} はコ…

関数ポインタに対応した make_overload を書いてみた

C++

書いてみた。 C++11 でも動作するはず。 [ソース] #include <functional> template<typename ...Args> struct overload; template<typename T> struct overload<T> : T{ using T::operator(); template<typename TT> overload(TT t) : T(t){} }; template<typename T, typename U, typename ...Args> struct overload<T, U, Args...> : T , ov…</t,></typename></typename></t></typename></typename></functional>

lambda の make_overload の話題

C++

C++ Truths: Fun with Lambdas: C++14 Style (part 2) ここに書かれている Overloaded Lambdas ですが、Lingr で『clang だと動作するけど gcc だと動作しないんだよねー』と話題になっていんたんですが、Twitter でも話題になっていたみたいですね。 Overlo…

Boost.Signals2 で false を返すと disconnect する

と、いうのを書きたかっただけ。 [ソース] #include <boost/signals2.hpp> #include <iostream> template<typename F, typename ...Args> boost::signals2::connection connect(boost::signals2::signal<void(Args...)>& sig, F func){ auto connecter = [=](boost::signals2::connection const& connection, Args... args){ if( !func(ar</void(args...)></typename></iostream></boost/signals2.hpp>…

Ubuntu に boost を入れた

とりあえず、自前で入れるのがちょっとめんどくさかったので apt-get で。 $ sudo apt-get isntall libboost-dev 特にパスを設定する必要もなくこれで boost が使えるように。 ただ、Ubuntu 13.10 だと Boost 1.53 とちょっと古めなので自前で最新版を入れて…

C++03 で final

C++

と、いうイディオムがあるという事がここら辺にかかれていたので試してみた。 [ソース] template<typename T> class final{ ~final(){} friend T; }; struct X : virtual final<X>{ }; struct test : X{ }; int main(){ // OK X x; // ERROR // test t; return 0; } 思いつ</x></typename>…

Vim Advent Calendar 2013 129日目:C++ の Vim でのコーディング風景をキャプチャしてみた

この記事は Vim Advent Calendar 2013 129日目の記事になります。 ただやりたかっただけというネタ。 C++ のコーディング風景をキャプチャしてみるなどしてみました。 キャプチャした動画を見なおしているといかに雑にコーディングしているなのかがわかる […

C++ FAQ

C++

以下の様なページがあったので覚書。 FAQ : Standard C++ ひと通り目を通したいけど量+英語でなかなか大変そう。

std::function を簡単に書いてみた

C++

特に理由はないけど簡単に書いてみた。 [ソース] #include <memory> template<typename T> using decay_t = typename std::decay<T>::type; template<typename Sig> class function; template<typename R, typename ...Args> class function<R(Args...)>{ struct handler{ virtual R operator()(Args... args) = 0; }; std::shared_ptr<handler> …</handler></r(args...)></typename></typename></t></typename></memory>

C++14 でアクセッサを書いてみた

C++

書いてみた。 [ソース] #include <utility> #include <iostream> template<typename T, typename Member> auto setter(T t, Member member){ return [=](auto&& x){ t ->* member = x; }; } template<typename T, typename Member> auto getter(T t, Member member){ return [=]{ return t ->* member; }; } class X{ int value = 42…</typename></typename></iostream></utility>

C++14 でラムダ関数を friend にする

C++

ふと『ラムダ関数を friend にするにはどうすればよいのか』と思って書いてみました。 とりあえず Clang 3.5 だと以下のようにラムダ関数の型を friend にすれば動作した。 [ソース] #include <iostream> auto func = [](auto x){ return x.value; }; class X{ friend </iostream>…

C++14 で関数オブジェクトから関数ポインタを返すc_function を実装してみた

C++

c_function についてははここら辺を参照して下さい。 これを C++14 でサクッと実装できないだろうかー、って事で以下の様なコードを書いてみたんですが、これを Clang 3.5(trunk) でコンパイルしてみたらコンパイラがエラー吐いた…。 [ソース] #include <type_traits> #in</type_traits>…

C++14 でローカルクラスを返す関数

C++

C++14 だとこんな愉快な事ができるのかーと思って書いてみた。 [ソース] #include <iostream> template<typename T, typename U> constexpr auto make_person(T name, U age){ struct person{ T name; U age; }; return person{ name, age }; } int main(){ constexpr auto homu = make_person(</typename></iostream>…

N3897: Auto-type members を使用したい場面

C++

関連:本の虫: 2014-01-pre-Issaquah-mailingのレビュー:N3890-N3899 ちょうどこの間書いたコードで decltype(value) m = value; とか泣きながら書いていたのでほしいなーとか思っていました。 あとはパッと思いついたコードだと struct X{ // 連続して同じ…

C++14 で名前付きタプル

C++

C++14 で名前付きタプルのようなものを書いてみた。 [ソース] #include <boost/preprocessor/seq.hpp> #include <boost/preprocessor/tuple.hpp> #include <boost/preprocessor/cat.hpp> #define PACK_FILLER_0(X, Y) \ ((X, Y)) PACK_FILLER_1 #define PACK_FILLER_1(X, Y) \ ((X, Y)) PACK_FILLER_0 #define PACK_FILLER_0_END #define PACK_FILLE…</boost/preprocessor/cat.hpp></boost/preprocessor/tuple.hpp></boost/preprocessor/seq.hpp>

C++ で文字列の繰り返し

C++

某所で少し話題になったのだけれど、例えば Ruby だと puts "homu" * 10 # => homuhomuhomuhomuhomuhomuhomuhomuhomuhomu みたいな感じで文字列の繰り返しを書けるのですが、C++ だとどうするのが楽か、という問。 とりあえず、* 演算子でできるように書いて…

make_overloaded_function 使ってみた。

前回の記事で『関数の型を書くのがめんどくさい』と書いたら id:RiSK さんから『make_overloaded_function があるよ』とコメントで教えて頂いたので試してみました。 [ソース] #include <boost/functional/overloaded_function.hpp> #include <boost/lexical_cast.hpp> #include <string> #include <iostream> std::string to_string(int n){ retur</iostream></string></boost/lexical_cast.hpp></boost/functional/overloaded_function.hpp>…

Boost.Functional/OverloadedFunction を試してみた

以前から気になっていたんですがやっと試してみました。 OverloadedFunction を使用すれば複数の関数を1つの関数オブジェクトにまとめる事ができます。 [ソース] #include <boost/functional/overloaded_function.hpp> #include <boost/lexical_cast.hpp> #include <string> #include <iostream> std::string to_string(int n){ return boost::lexi</iostream></string></boost/lexical_cast.hpp></boost/functional/overloaded_function.hpp>…