2011-04-01から1ヶ月間の記事一覧

C++0x で make_fused を書く

C++

Variadic Templates を使うことによって、驚くほど簡潔に書くことができます (Egg に合わせて fuse という名前にしています)。 #include <cstddef> #include <tuple> #include <type_traits> #include <utility> namespace fuse_detail { template <std::size_t ...Indexes> struct index_tuple { typedef index_tuple<Indexes..., sizeof...(Indexes)> next;</indexes...,></std::size_t></utility></type_traits></tuple></cstddef>…

関数適用演算子

Haskell には関数適用演算子 $ があり、しばしば括弧を省く目的で用いられます。C++ でもやってみましょう。 #include <utility> namespace apply { template <class F, class A> inline auto operator|=(F &&f, A &&a) -> decltype(std::forward<F>(f)(std::forward<A>(a))) { return std::fo</a></f></class></utility>…

C++03 で使える reference_wrapper

導入 C++0x の std::reference_wrapper は operator() を参照先に forward するので、関数オブジェクトを要求する関数 (STL アルゴリズムなど) にそのまま渡すことができます。 しかし、boost でこれに相当すると思われる boost::reference_wrapper にはこの…

range-based for マクロを書いてみた

C++

range-based for は案5に決まったらしいので、勉強がてらに自分で実装してみました。せっかくなので、VC10 でも動くようにしています。まずは使い方から。 int main() { // http://www.kmonos.net/alang/boost/classes/foreach.html int array[] = {1, 2, 3,…

C API の range ラッパー

以前少し考えたことがあったのですが、最近同じ話題を見かけたのでまとめてみました。 Range の要素がメモリの連続領域にあること (すなわち、&*(begin(r)+n)==&*begin(r)+n が常に成り立つこと) が保証されていれば、その range のデータをレガシーな C API…

type_traits を実装する (2)

C++

つい先日まで、is_constructible は SFINAE を使って以下のように実装できるものだと思っていました。 ※この記事では void や array of unknown bound は考慮しません。 template <class T, class ...Args> struct is_constructible { private: template <class U, class = int> struct test : std::false_t</class></class>…