C++

プリプロセッサで代入しましょう!

さて今回は代入です。とはいっても関数マクロを展開中に代入とかは無理です。なので、#defineで、プリプロセスシンボルに代入しましょう。 あともうかなりめんどいので超展開で話が進みます。 #define A 1 #define B A #undef A #define A 2 B 最後の行のBは…

プリプロセッサでループしましょう!

みなさんいかがお過ごしでしょうか?前回は足し算しました。今回はループです。 足し算ではとにかくいっぱいPP_ADD_Iを並べましたが、もっとスタイリッシュに書きたいですね。書きましょう。 まずC/C++のループはこんな感じです: while (condition) { ... }…

プリプロセッサで足し算しましょう!

プリプロセッサは所詮文字列置換、計算なんてできやしない…そう思っている方は多いでしょう。しかしそれは違います。計算できます。 本日の目的はプリプロセッサで足し算です。ADD(3, 2)と書けば5と答えてくれる関数マクロを作ってみましょう。 おっと、#def…

nullを許容しないスマポ

C++

template<typename T> struct smart_ptr { ... explicit smart_ptr(T * ptr) : ptr_(ptr) {} template<typename U> smart_ptr(smart_ptr<U> const & other) : ptr_(other.get()) {} smart_ptr & operator=(T * ptr) { ptr_ = ptr; ... return *this; } template<typename U> smart_ptr & operator=(s</typename></u></typename></typename>…

プリプロセッサで指数爆発させる

C++

関数fと引数vのタプルと、整数nを渡すとvにfを2^n回適用する関数マクロを作った #define PP_TUPLE_ELEM_0(a, b) a #define PP_TUPLE_ELEM_1(a, b) b #define PP_TUPLE_ELEM(n, tup) PP_TUPLE_ELEM_I(n, tup) #define PP_TUPLE_ELEM_I(n, tup) PP_TUPLE_ELEM_…

世間でのC++のテンプレートに対するバッシングと言い訳

C++

テンプレートを使うとコードが読みにくい 多分vector<int>を読みにくいと言う人はいないと思う。むしろ、テンプレートの存在を知っているならば、「int用のvectorだ」と素直に理解できるぐらい簡単。読みにくいのは、例えば(次のコードは例なので、意味は分から</int>…

世界一遅い「C++テンプレートテクニックが発売」のお知らせ

C++

私の知人へのハブとして、発売しました >C++テンプレートテクニック で、買ったはいいがフォトンブラスターとかミサイルランチャー使い込んでたのであまり読み進んでない。今3章読み始めた。もうこのへん読み飛ばしてもいいかな。

直前のエントリーのコードの解説 for 自分

C++

直前のエントリーのコードは、{f, a, b, ...}というtupleを受け取って、a, b, ...にfを適用して返すという関数で、fやaやbがtupleであれば、それらに対しても再帰的にapplyを適用した上でf(もしくはapply(f))を適用する。{{a, b, c}, d, {e, f, g} } なら …

とりあえずメモ

C++

http://twitter.com/Cryolite/status/1571598248 のやつ 一部抜けている定義とかあるけど気にしない。あと完全にコピーで作ってるけどこれも気にしない。 template<typename T> struct sizeof_; template<typename ...T, template<typename ...> class TT> struct sizeof_<TT<T...> > { constexpr size_t const value = s</tt<t...></typename></typename>…

エラー付き戻り値クラステンプレート

C++

もうだいぶ前だが、http://www.kmonos.net/wlog/88.html とか http://d.hatena.ne.jp/gnarl/20071216/1197774166 とか見て、エラーの処理を呼び出し側で柔軟にできるようにならないかと思って書いた(んだと思う)。 error.hpp#if !defined ERROR_HPP_INCLDU…

あともう一冊宣伝

http://d.hatena.ne.jp/faith_and_brave/20090408/1239205628 かの有名な巨匠二人の手による一品ということなので、私の知り合いでC++使ってるのにtemplate禁止とかC++の意味がねこそぎ奪われているような環境に浸っている諸兄は、これを機会にtemplateとの…

constメンバオブジェクトとmove

C++

struct Foo { Foo() = default; Foo(Foo const & foo) = default; Foo(Foo && foo) {} }; struct Bar { Foo const foo; Bar() = default; Bar(Bar const & other) = default; Bar(Bar && other) : foo(std::move(other.foo)) {} // foo の初期化にはコピーコ…

昨日のやつの現状把握

C++

訳が分からなくなってきたのでまとめてみる。以下、登場する識別子は、特に明記されていない限りnewtype名前空間中に定義されている。 全体的にETで実装。 2項演算のとき、各項の要素の型は違っていてもよい。detail::binary_promoteメタ関数で適当に型計算…

三次元ジオメトリ計算用ETライブラリ

C++

そろそろ日記書くべきだということで、はるか一年ぐらい前に書いたジオメトリ計算用ライブラリをちょこっと手直しして載せてみる。 もともと行き当たりばったりに書いていたものなので、とってもカオス。特に同次座標辺りはすごい適当な扱い。ほとんど計算に…

全部前にもってくる

C++

型修飾子を識別子の前に持ってこれるようにした。#if !defined EXIST_DECLARE_HPP_INCLUDED #define EXIST_DECLARE_HPP_INCLUDED#include <boost/function_types/function_type.hpp> #include <boost/function_types/member_function_pointer.hpp> #include <boost/function_types/parameter_types.hpp> #include </boost/function_types/parameter_types.hpp></boost/function_types/member_function_pointer.hpp></boost/function_types/function_type.hpp>

Nice bug.

C++

template<typename ID> struct msvc_extract_type { struct id2type; }; template<typename T, typename ID> struct msvc_register_type : msvc_extract_type<ID> { typedef msvc_extract_type<ID> base_type; struct base_type::id2type // This uses nice VC6.5 and VC7.1 bugfeature { typedef T type; };</id></id></typename></typename>…

同じスコープ内に重複した名前を宣言する

C++

お遊び。 namespace ns { typedef int declared; struct undeclared { int dummy[2]; }; template<size_t> struct S; template<> struct S<sizeof(undeclared)> { template<int> struct SS { declared n; void operator=(int) {} SS(int) {} friend SS & operator>(int, SS & ss) { return ss;</int></sizeof(undeclared)></size_t>…

色々な関数宣言の練習

C++

ちょっと仕事で宣言からtypedefで宣言された型名を調べる必要があって、構文解析の真似事が必要になったので。 // int を返す関数へのポインタを返す関数へのポインタ int (*(*pf)())();int ff() { return 0; } int (*f())() { return ff; }pf = f;// int を…

Boost.ScopeExitの実装をのぞいてみる

C++

これぐらいなら俺でも余裕で作れると思ったらそうは問屋が卸さなかった。 void f() { int n = 0; vector<int> v; BOOST_SCOPE_EXIT)((n)(&v))( { v.push_back(n); cout << v[0] << endl; } BOOST_SCOPE_EXIT_END } このコードをBoost.Preprocessorに通してからそ</int>…

もしかして:

C++

http://blogs.wankuma.com/episteme/archive/2009/02/06/167590.aspx #include <boost/range.hpp> template<typename Range, typename T> bool contains(Range const & range, T const & val) { return std::find(boost::begin(range), boost::end(range), val) != boost::end(range); } vector<int> v; if (con</int></typename></boost/range.hpp>…

カリー化手直し

C++

http://d.hatena.ne.jp/DigitalGhost/20080706/1215324721 を手直し。全然テストしてないけど。 9引数まで対応 適当に引数を束縛してからBoost.Functionとかに放りこめるようにした currying.hpp #if !defined CURRYING_HPP_INCLUDED_ #define CURRYING_HPP_…

CheatSheet

C++

STLのalgorithm, Boost.Iterator, Boost.Lambda, p_stade.Oven, ぐらいがあれば。

typeof完成させた

C++

型を登録する際に自前でID書かなくてもいいようにした。VC8で確認。かなり重い。やっぱりmpl::vector使わずに自前のやつの方がよかったかな。 追記:あぁ、そういえばこれパラメータが一つだけのtemplateはなんか失敗するんだった。後で直す。

右結合の方がかえって都合がいい

C++

http://d.hatena.ne.jp/faith_and_brave/20081205/1228482485 そんなわけ(思いつきと衝動)で>>=が右結合である事を利用してLazyに作ってみた(Lazyなのは評価戦略だけじゃなくてコードの作りと私自身も)。 maybe.hpp #if !defined EXIST_MAYBE_HPP_INCLUD…

templateで学ぶやる気のないclosure

template<typename T> struct Foo { template<typename> struct Bar { typedef T type; // Barの外側の環境にあるTを保持している }; };</typename></typename>

風が吹けば桶屋が儲かる

C++->Boost.Function/Lambda->関数型プログラミング->OCaml, Scheme, Haskell, unlambda, Lazy K->数学 あと、 Boost.Lambda->式テンプレート->テンプレートメタプログラミング->関数型プログラミング->(以下同文) 以上のように、C++を始めれば数学も始め…

Boost.Typeofのuniqueなid生成

C++

なんだ、ずっとプリプロセッサで実装されてたじゃないか。

今度こそ

C++

※日付が間違っていたのでエントリーを移動 typeofできた。残念ながら途中で型にID振るためのカウンタを作るのが面倒になったので、コード中に謎の数値が散見されるが気にしてはいけない。 型と整数をパラメータとして取るテンプレートも扱えるようにするあた…

怪しいカウンタ

C++

以前のBoost.typeofで型にid振るのに使われてたカウンタって、http://d.hatena.ne.jp/Cryolite/20050923#p1にあるカウンタのようなものだった気がするのだが、どうなんだろう?

Effective C++の次期規格版は

C++

出るのだろうか?第3版も47項(traitsの話)とかは次期規格だとconcept使えってなるしなぁ。そもそもconceptの話が無いと標準ライブラリすら解説できないような。いやそれよりももっと前に、ただのforすら完全には解説できない。もういっそのこと次期規格ではt…