C++0x

可変長マクロ引数の話

これはC++11 Advent Calendar 2011の4日目の記事です。 C++11ではプリプロセッサが可変長マクロ引数に対応しました。例を挙げましょう。 #define ROTATE(...) ROTATE_I(__VA_ARGS__) #define ROTATE_I(x, ...) __VA_ARGS__, x ROTATE(1, 2) // 2, 1 ROTATE(R…

Phoenix v3で遊ぶ

日記を書かないと死ぬらしい(ソース不明)ので書きましょう。 Phoenix v3がtrunkにあるということで、前に作ったコードを修正しながら遊んでみました。そういえば前は確かapply作ろうとしたらbindになったとか言いましたが、よく考えたらやっぱりapplyでし…

新しいswitch statementのご案内

前に http://ideone.com/7NnRj というのを書いて、その後パターンマッチとかできればうれしいなーと思ったので、そんなものを書いた。書いてるうちにぼくのかんがえたさいきょうのぱたーんまっち。という記事が先に上がってたのでこれお蔵入りかなーとか思っ…

プリプロセス時足し算・引き算・かけ算・剰余演算を定数時間で

http://ideone.com/eK4vc #include <boost/preprocessor/cat.hpp> #define PP_ADD_C(x, y) PP_NAT_TO_LIT(PP_NAT(x) PP_NAT(y)) #define PP_SUB_C(x, y) PP_COMPL(PP_ADD_C(PP_COMPL(x), y)) #define PP_MUL_C(x, y) PP_NAT_TO_LIT(PP_CST_REPEAT(x, PP_NAT(y))) #define PP_MOD_C(x, y) </boost/preprocessor/cat.hpp>…

新型scope guard

以前にも何回か書いているスコープガードネタですが(これ、これ、これ)、http://d.hatena.ne.jp/faith_and_brave/20100921/1285049653 とか http://d.hatena.ne.jp/gintenlabo/20100921/1285084859 から、なんかtwitterで話のネタになってたので、ちゃんと…

user-defined string literalはliteral operator templateでほげほげできないと何度言ったら…

私自身何度も疑問に思ってはその度に調べていたし、しょっちゅうtwitter上でも話題になるのでここに書いておきましょう。 すごく手短に言うと、 template<char ...str> struct hoge_t {}; template<char ...str> constexpr hoge_t<str...> operator ""_hoge();このような定義(ここではliteral </str...></char></char>…

WG21 Paper n3030 Rvalue Reference as "Funny" Lvalues を Background だけ訳した(主に私が理解するため)

そのうち江添さんがきっちりとしたエントリーにするだろうけど、折角途中まで訳したし、背景だけ終わらせて置いときます(一部訳せなかったけど)。間違いとか飛躍しすぎとかがあればコメントなりtwitterなりで教えていただけると、私のえーぶんどっかいりょ…

Variadic Template Parameters のパラメータの数を制限する

Variadic Template Parameterで対応できない例として、最低N引数以上の可変個引数関数を宣言する一般的な方法、というのを思いだしたんだけど、 template<typename ...Params> decltype( boost::enable_if< boost::mpl::bool_<(sizeof...(Params) > 2)>, int>::type()) f(Params.</typename>…

タプルの要素数を数える

世間では空前のプリプロセッサブームですね! http://codepad.org/IwJ4sqA9 C++0xの規格を眺めていると、プリプロセッサのセクションに可変長引数リスト付きマクロが入っていたので、これを使って何か面白いことができないかと考えていたところ、タプルの要…

二項演算子を前置する遊び

#include <utility> #include <tuple>namespace prefix_op {namespace detail {template<size_t N, typename T> typename std::tuple_element<N, T>::type & get_with_tuple_ref_collapsing(T & tup) { return std::get<N>(tup); } template<size_t N, typename T> typename std::tuple_element<N, T>::type && get_with_tu…</n,></size_t></n></n,></size_t></tuple></utility>

範囲つきintのガワを適当に書いてみた結果

template<int Min, int Max> struct ranged_int { ranged_int() = default; ranged_int(ranged_int const &) = default; template<int N, typename = enable_if<(N >= Min) && (N < Max)>::type> ranged_int(integral_type<int, N>) : n_(N) {}; template<int Min1, int Max1, typename = enable_if<(Min1 >= Min) && (Max1…</int></int,></int></int>

tieで初期化させろ

#include <boost/preprocessor/tuple/elem.hpp> #include <boost/preprocessor/tuple/rem.hpp> #include <boost/preprocessor/seq/fold_left.hpp> #include <boost/preprocessor/arithmetic/inc.hpp>template<size_t N, typename T> typename std::tuple_element<N, T>::type & get_with_tuple_ref_collapsing(T & tup) { r…</n,></size_t></boost/preprocessor/arithmetic/inc.hpp></boost/preprocessor/seq/fold_left.hpp></boost/preprocessor/tuple/rem.hpp></boost/preprocessor/tuple/elem.hpp>

Boost.Lambdaでletとかwhereを書かせろ

#define LET(var) [&] { var IN #define IN(body) return body; }() #define LAMBDA(def) [&] { LAMBDA_WHERE(LAMBDA_WHERE_I def) return LAMBDA_BODY def )); }() #define LAMBDA_WHERE_I(body) LAMBDA_WHERE_II #define LAMBDA_WHERE_II(where) NIL where…

decltypeが括弧あるとかないとかで色々

n2914 7.1.6.2.4 The type denoted by decltype(e) is defined as follows: if e is an unparenthesized id-expression or a class member access (5.2.5), decltype(e) is the type of the entity named by e. If there is no such entity, or if e names a…

Conceptのお通夜会場はこちらです

まさかのご臨終…

超簡単scope_guard

struct scope_guard { std::function<void()> f_; bool dismiss_ = false; template<typename F> scope_guard(F && f) : f_(std::forward<F>(f)) {} scope_guard() = delete; scope_guard(scope_guard const &) = delete; ~scope_guard() { if (!dismiss_) { f_(); } } void dismiss</f></typename></void()>…

簡単な練習

using std::forward; using std::tuple; using std::get;template<size_t ...Seq> struct counting_sequence {};template<size_t N, size_t ...Seq> struct make_counting_sequence_impl { typedef typename make_counting_sequence_impl<N - 1, N, Seq...>::type type; };template<size_t ...Seq> struct make_counting_se…</size_t></n></size_t></size_t>

書いてる傍から

http://jp.youtube.com/watch?v=oAhrFQVnsrY コンパイル時に template とか定数式を評価したらこうなります的なコードを表示してみせる機能だと思う。 VCの Intellisence もこれぐらいの仕事をしてくれたりは…しないだろうなぁ。なんといってもコンパイル遅…

あぁところで、

template<concept Iterator> concept Range<typename T> { Iterator iterator; iterator begin(T&); iterator end(T&); }; template<typename Rng> requires Range<RandomAccessIterator><Rng> // !? && ShuffleIterator<T::iterator> && LessThanComparable<T> void sort(Rng& range) { std::sort(begin(range), end(range…</t></t::iterator></rng></randomaccessiterator></typename></typename></concept>

一人で勝手にぶり返してみる

先日のconceptにtemplateのようなものをつけ足した物体について(本当は昨日書こうと思ったが、野郎二人で飲んで歌ってた)。 そもそもRangeに一体どのような意味があるのか完全に把握していないが、私個人は、Rangeはただ単に範囲を示すだけのconceptである…

それもtemplateに

http://d.hatena.ne.jp/faith_and_brave/20081125/1227604874 これの14 template<concept It> concept Range<typename T> { It iterator; iterator begin(T&); iterator end(T&); }; template<Range<RandomAccessIterator> Rng> void sort(Rng& range) { std::sort(begin(range), end(range)); } concept template</range<randomaccessiterator></typename></concept>…

右辺値の変換規則について

struct Foo { Resource* r_; Foo() r_(new Resource) {} Foo(Foo & foo) : r_(new Resource(*foo.r_)) {} // A Foo(Foo const & foo) : r_(new Resource(*foo.r_)) {} // B Foo(Foo && foo) : r_(foo.r_) {foo.r_ = nullptr;} // C Foo(Foo const && foo) : …