2011-04-01から1ヶ月間の記事一覧
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++0x の std::reference_wrapper は operator() を参照先に forward するので、関数オブジェクトを要求する関数 (STL アルゴリズムなど) にそのまま渡すことができます。 しかし、boost でこれに相当すると思われる boost::reference_wrapper にはこの…
range-based for は案5に決まったらしいので、勉強がてらに自分で実装してみました。せっかくなので、VC10 でも動くようにしています。まずは使い方から。 int main() { // http://www.kmonos.net/alang/boost/classes/foreach.html int array[] = {1, 2, 3,…
以前少し考えたことがあったのですが、最近同じ話題を見かけたのでまとめてみました。 Range の要素がメモリの連続領域にあること (すなわち、&*(begin(r)+n)==&*begin(r)+n が常に成り立つこと) が保証されていれば、その range のデータをレガシーな C API…
つい先日まで、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>…