TMP

ET + decltype = infix な TMP

template< int N > struct int_{ static int const value = N; }; int_< 1 > _1; int_< 2 > _2; int_< 3 > _3; template< class LHS, class RHS > int_< LHS::value + RHS::value > operator+( LHS, RHS ); template< class LHS, class RHS > int_< LHS::val…

for each

あ〜もうくそぅ!!俺は↓がやりたいねん!! std::vector<int> v; v.push_back(0); v.push_back(1); v.push_back(2); FOREACH(it, v){ // ←これがやりたい.これがっ!! std::cout << *it << std::endl; }あーーー!!あーーー!!あーーーーー!!!!!11 何</int>…

素数を求めるプログラム

何か面白いことを思いつくたびにちょこちょこ書き溜めていて,その結果できあがった素数を求めるぷろぐらみゅ.VC7.1もしくはGCC3.4.2にBoost1.32.0の組み合わせで動作確認.それ以外で動くかどうかは知らないというか厳しいだろうなあ. ちなみに説明一切な…

チラシの裏

あ,そうか・・・.外側を隠すっつーのなら対等に混ぜればいいわけじゃん. #うぎゃー!!これバグじゃ・・・?標準規格的には完璧にOKなはずにゃ〜!! #まぢかよ・・・.これ曖昧なのかよ・・・.オーバーロードにしてくれてもいいじゃ〜ん.ぶ〜ぶ〜ぶ…

コンパイル時におけるグローバルな状態

コンパイル時メタプログラミングにグローバルな状態を持たせるテクニックを思いついたけれど,そのテクニックの応用がまったく思いつかないんだもんなー.できることがせいぜいインクリメントだけのグローバルカウンタとか,単に一方向に状態遷移していくだ…

有益なバグ?@VC++7.1

つーか,よくよく見たらこれVC++7.1のバグやんw. #あ〜,SFINAEとsizeofの組み合わせっつー言語規格で明確に言及されていない状況で戯れているコードだから「バグ」って表現はまずいな.あれだ.鼻から悪魔が出てきてる状態って表現すれば良いのか. 注意…

式有効性判定手法

くそぉ・・・.任意の式が有効かどうかを判定するintrospection系メタ関数の実装手法を思いついたのにGCCで通りやがらねぇ・・・.VC++7.1では通るんだけどなぁ.まぁ,明らかに言語規格の間隙を突いたような実装なので無理もないっちゅーたらそうなんだけど…

テンプレートによる多重ループの静的展開

#include <cstddef> #include <iostream> template< std::size_t I, std::size_t L, std::size_t K, std::size_t M , std::size_t J, std::size_t N > struct j_loop { static void invoke( double const (&a)[L][M], double const (&b)[M][N], double (&c)[L][N] ) { c[I][J] +</iostream></cstddef>…

あ〜,MPLのラムダ(というかPlaceholder Expression)って気軽なわりにtemplate template引数の代替になったりtypedef templateの代わりになったりメタ関数クラスになったりもはやなんでもありだな,こりゃ.えげつなく強力.使い方次第でどうにでも化ける…

SFINAEによるETのオーバーロード制限(2004/12/29のototoiさんのコメントへのレス)

>すべてのETライブラリが上のように引数の型を限定していないと、同時に複数のETライブラリを使おうとしたときODR違反になってしまいます。 なので,従来CRTPで行われていた引数の型に対する制限(オーバーロードの導入の制限)をSFINAEで書き換えられるん…

SFINAEが使えればETにおけるCRTPは不要?

ありゃ?そういえばExpression Templateには演算子のオーバーロードを制限するためにCRTPが必須だと今までずっと思い込んでいたけれど,よくよく考えてみればSFINAEで制限出来るじゃん.演算子の場合引数の個数が固定されるからSFINAEが使えないとばかり勘違…

今日の収穫物

C++ Template Metaprogramming: Concepts, Tools, and Techniques from Boost and Beyond (C++ In-Depth Series) あー! クラスの構造をTMPのレベルで可変にする議論キタ━━━━━━(゜∀゜)━━━━━━ !!!!! いー! 線型継承によるClass Compositionキタ━━━━━━(゜∀゜)…

積生成 in Boost.MPL(改)

#include <boost/mpl/long.hpp> #include <boost/mpl/plus.hpp> #include <boost/mpl/minus.hpp> #include <boost/mpl/multiplies.hpp> #include <boost/mpl/divides.hpp> #include <boost/mpl/modulus.hpp> #include <boost/mpl/list.hpp> #include <boost/mpl/begin_end.hpp> #include <boost/mpl/at.hpp> #include </boost/mpl/at.hpp></boost/mpl/begin_end.hpp></boost/mpl/list.hpp></boost/mpl/modulus.hpp></boost/mpl/divides.hpp></boost/mpl/multiplies.hpp></boost/mpl/minus.hpp></boost/mpl/plus.hpp></boost/mpl/long.hpp>

直積生成 in Boost.MPL

Boost.PreprocessorにあるBOOST_PP_SEQ_EACH_PRODUCTのTemplate MeataProgramming版. #っていうかBOOST_PP_SEQ_EACH_PRODUCTなんて無いし.BOOST_PP_SEQ_FOR_EACH_PRODUCTでした.っていうかこのTMP版も生成した直積を陽にシーケンスで返すんじゃなくて,…

小さい算術クラスでのExpression Template

うにゅぅ.id:ototoiさんのところで指摘されてた現象(id:ototoi:20041126#p1)が再現しない・・・. #include <cstddef> template<class LHS, class RHS> class vector_plus { public: vector_plus(LHS const &lhs, RHS const &rhs) : lhs_(lhs), rhs_(rhs) { } double operator[](std::siz</class></cstddef>…

type dispatcher by mpl

#include <boost/preprocessor.hpp> #include <boost/mpl/pair.hpp> #include <boost/mpl/same_as.hpp> #include <boost/mpl/always.hpp> #include <boost/mpl/switch.hpp> #include <boost/mpl/bool.hpp> #include <boost/mpl/list.hpp> #define TYPE_DISPATCHER_MAX_ARITY 10 struct error_t; template<class T, class F>…</class></boost/mpl/list.hpp></boost/mpl/bool.hpp></boost/mpl/switch.hpp></boost/mpl/always.hpp></boost/mpl/same_as.hpp></boost/mpl/pair.hpp></boost/preprocessor.hpp>

TMPとFP

っていうか sign n | n > 0 = 1 | n == 0 = 0 | n < 0 = -1↓↓↓↓↓↓↓↓↓↓ template<class Integer, class = disable_if<less_equal<Iteger, zero> >::type> struct sign : public int_<1>{ }; template<class Integer> struct sign<Integer, enable_if<equal_to<Integer, zero> >::type> : public int_<0>{ }; template</integer,></class></class>

TMPとFP

「そうそう,Haskellで遊んで思ったんですがC++のTemplate MetaProgrammingってFunctional Programmingな側面が強いですね」ってネタをいつか振ろうとしていたんですが,↑のスレッド読んでたらその気が失せました.自分がごちゃごちゃ言うより↓のポスト(↑の…

MPL Set

http://lists.boost.org/MailArchives/boost/msg72170.php なんだ,もう使える状態なのか・・・って http://cvs.sourceforge.net/viewcvs.py/boost/boost/libs/mpl/test/set.cpp?view=markup ( ゜∀゜)アハハ八八ノヽノヽノヽノ \ / \/ \ 聞きました,奥さ…

特殊化(SFINAE)を使わずにpow

根本的に間違いがあったので削除. 今日の心得:テンプレート再帰は特殊化じゃないと止まらない.

メタpowについて補足

id:Cryolite:20040923#p1のメタpowについて若干補足.整数べきの高速な算法として例えば2^10を 2^10 = 2^(2+8) = 2^2 * 2^8に分解 2*2を計算 2^4を2.で計算した2^2を使って(平方して)計算 2^8を3.で計算した2^4を使って計算 2^2と2^8を乗じて2^10を計算 と…

上を踏まえて実際にやりかったのが以下. #include <boost/utility/enable_if.hpp> #include <boost/mpl/arithmetic.hpp> #include <boost/mpl/bitwise.hpp> #include <boost/mpl/comparison.hpp> #include <boost/mpl/int.hpp> #include <iostream> typedef boost::mpl::int_<0> zero; typedef boost::mpl::int_<1> one; // pow(m, n) = pow(m…</iostream></boost/mpl/int.hpp></boost/mpl/comparison.hpp></boost/mpl/bitwise.hpp></boost/mpl/arithmetic.hpp></boost/utility/enable_if.hpp>

再帰算術メタ関数の再帰停止条件

a(n) = a(n-1), a(0) = 1で定義される簡単な数列を模した算術メタ関数を作ろうとした.今回,static constな定数(value)を内部に持たずに,あくまでメタ関数としてのみの機能(type)を提供するメタ関数を作ることにこだわってみた.なので,入力・出力はb…

内部型またはメンバの有無を調べるメタ関数

id:Cryolite:20040911#p4の続き.元記事は↓. http://lists.boost.org/MailArchives/boost/msg70844.php 詳細については必ず元記事とそこからたどれるpaperを参照してください. 以下のコードはVC++7.1でのみ動作を確認. #include "concept.h" // 記事中か…