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 のデフォルトのデリータは何なのか調べてみたら次のように定義されているみたい。 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>…
と、いうのが 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>…
と、いうのが 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 - 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 事情はよく知らないのだけれどだ…
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>…
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[] が定義されてないんですね。 基本的には range-based for 使っているので気にならないんですが、この前ランダムアクセスしようと思ったらエラーになって面食…
そういえば、使ったことがないので試してみた。 Boost.ScopeExit を使用すると『そのスコープを抜けるときの処理』を記述する事ができます。 例えば、スコープの最初の方に『最後に呼ばれる処理』みたいなことを定義する事ができます。 [ソース] #define BOO…
みたいな話が Lingr の C++ 部屋で出てた。 そういうことを実現したい場合は Boost.Fusion を使うのが現実的かな? (reinterpret_cast で無理やり変換してしまうという手が無いわけではないのだけれどさすがにアレ過ぎるので。 [ソース] // 構造が全く同じ…
Lingr の C++ 部屋で話題になったのですが、参照キャプチャしたラムダを static 変数で保持するのは未定義の動作になることがあるので注意しましょうという話。さて、話題になっていたのは次のようなコードです。 void func(int const& i){ static auto f = …
少し前になるんですが LLVM 3.4.1 がリリースされました。 LLVM 3.4.1 Release Notes — LLVM 3.4 documentation LLVM Download Page
Lingr の C++ 部屋で struct X{ X(){} }; と struct X{ X() = default; }; との違いはなんだろう、みたいな話で盛り上がっていたので覚書。 結論からいうと以下のような感じらしい。 http://lingr.com/room/cpp/archives/#message-19090582 要は X(){} はコ…
書いてみた。 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>
C++ Truths: Fun with Lambdas: C++14 Style (part 2) ここに書かれている Overloaded Lambdas ですが、Lingr で『clang だと動作するけど gcc だと動作しないんだよねー』と話題になっていんたんですが、Twitter でも話題になっていたみたいですね。 Overlo…
と、いうのを書きたかっただけ。 [ソース] #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>…
とりあえず、自前で入れるのがちょっとめんどくさかったので apt-get で。 $ sudo apt-get isntall libboost-dev 特にパスを設定する必要もなくこれで boost が使えるように。 ただ、Ubuntu 13.10 だと Boost 1.53 とちょっと古めなので自前で最新版を入れて…
と、いうイディオムがあるという事がここら辺にかかれていたので試してみた。 [ソース] 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++ のコーディング風景をキャプチャしてみるなどしてみました。 キャプチャした動画を見なおしているといかに雑にコーディングしているなのかがわかる […
以下の様なページがあったので覚書。 FAQ : Standard 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>
書いてみた。 [ソース] #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>
ふと『ラムダ関数を friend にするにはどうすればよいのか』と思って書いてみました。 とりあえず Clang 3.5 だと以下のようにラムダ関数の型を friend にすれば動作した。 [ソース] #include <iostream> auto func = [](auto x){ return x.value; }; class X{ friend </iostream>…
c_function についてははここら辺を参照して下さい。 これを C++14 でサクッと実装できないだろうかー、って事で以下の様なコードを書いてみたんですが、これを Clang 3.5(trunk) でコンパイルしてみたらコンパイラがエラー吐いた…。 [ソース] #include <type_traits> #in</type_traits>…
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>…
関連:本の虫: 2014-01-pre-Issaquah-mailingのレビュー:N3890-N3899 ちょうどこの間書いたコードで decltype(value) m = value; とか泣きながら書いていたのでほしいなーとか思っていました。 あとはパッと思いついたコードだと struct X{ // 連続して同じ…
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>
某所で少し話題になったのだけれど、例えば Ruby だと puts "homu" * 10 # => homuhomuhomuhomuhomuhomuhomuhomuhomuhomu みたいな感じで文字列の繰り返しを書けるのですが、C++ だとどうするのが楽か、という問。 とりあえず、* 演算子でできるように書いて…
前回の記事で『関数の型を書くのがめんどくさい』と書いたら 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>…
以前から気になっていたんですがやっと試してみました。 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>…