c++
http://d.hatena.ne.jp/wiseler/20080731/p1 Bruceのコードがあんまりなのはわかりますが、論点はそこではないです。Javaで上の二つのものと同じような簡潔なコードは書けるのでしょうか? それとも、不当な例なのでしょうか。 ここに挙げられてたコードは、…
それくらいデフォで用意しとけってーの!なんかboostにはあるとかないとか。 "null ostream"でぐぐるとなんかでる。streambufをちょっと拡張してostreamに渡してやればいいらしい。 null ostream? - C / C++ struct null_streambuf:streambuf { int overflow…
動機 APIなんかで、よく bool GetSomeValue(type param1,type param2,type* result); 式の関数を見かける。引数で結果を格納する場所を渡し、「成功したかどうか」を返値とするやつ。 エラー処理をまじめにやると bool result; type value; result=GetSomeVa…
src #include <iostream> using namespace std; struct test { test(bool) {cout << "test(bool)" << endl;} test(const test&) {cout << "test(const test&)" << endl;} operator bool() {return true;} }; int main() { cout<<"bool b=test(true)"<</iostream>
template<typename T=void> struct WinResult { WinResult<T>() { success=false; error=::GetLastError(); } WinResult<T>(BOOL res,T val) { if(res) {success=true;value=val;} else {success=false;error=::GetLastError();} } WinResult(const WinResult& rhs):success(rhs.suc</t></t></typename>…
こないだのエントリにも書いたけど。つづき。 ルール・剰余使わない・実行時に行なうのはI/Oのみ(数列の生成も条件分岐もコンパイルタイムに処理する) #include <iostream> using std::cout; using std::endl; template<int c,int fiz,int buz> struct FizzBuzz { static void exec() { cout <</int></iostream>…
73行。boost/mplやboost/lambda駆使すれば20行くらいになるかな? なんかあんまり純粋関数な感じしないんだよね微妙。 template<bool cond,typename th,typename el> struct if_; template<typename th,typename el> struct if_<true,th,el> { typedef th result; }; template<typename th,typename el> struct if_<false,th,el> { typedef el result; }; template</false,th,el></typename></true,th,el></typename></bool>
檜山先生のモナドの説明を純粋関数型言語C++で書いてみました。 #include "stdafx.h" template<int n> struct int_{static const int value=n;}; //例の最初に出てくる副作用ありバージョンはそもそも記述できないのでいきなり副作用なしバージョン。 template<typename T,typename C> stru</typename></int>…
こないだ作ったやつについて、もう少々。 schemeの基本となるデータ型はconsだけど、これは template<typename CA,typename CD> struct Cons { typedef CA car; typedef CA cdr; }; という型で表現される。CA,CDには任意の型を指定できるわけだが、int型の値はそのままでは入らないの</typename>…
set!なんて静的にどうにかなりそうなのじゃなくて、I/Oとか乱数とかdynamicに評価しないと絶対どうにもならないやつをどうするか―― つまりモナド的なアレの導入を! まず、静的に評価可能な操作とそうでない操作は静的に識別可能(ややこしい)。すなわち: 定…
つまりはset!。 変数テーブルはネストした型として表現されているので、一度束縛された値を変更することはできない。さてどうするか。 単純な例なら、意外とあっさり解決する。evalはのペアからを返す関数となっているが、これをのペアを返すようにする。 <a, ((a 10) (b 20))> =</a,>…
C++ for Haskellerにまとまってるけど、自分でも書いてみる。データ構造をネストした型で定義して、テンプレートの部分特殊化によるマッチングで条件分岐しつつ処理。これが基本戦略。 データ型 データ型は二種類あります。これらは文法で厳密に区別され、メ…
(define m 1000) (define p (lambda (x y z) x)) (define q (lambda (x y z) y)) (define r (lambda (x y z) m)) (define t (lambda (x th el) (if (= x 0) (th) (el))) (p 1 2 3) => 1 (q 1 2 3) => 2 (r 1 2 3) => 1000 (t 0 (lambda () 1111) (lambda () …
こんなことばかりしてるとSchemeが病的に好きな人みたいに思われそうですが、特にそういうこともありません(それどころかSchemeでまともなプログラムを組んだこともない始末)。 それはともかく、Generic ProgrammingとかModern C++ Designとか読んでたら非常…
低い移植性 あらゆるプラットフォームにC++コンパイラがあるが、それらすべてには独自拡張とテンプレート関係のバグがある。 経験が必要 他の言語を学ばずにC++を習得するのは困難である。なぜなら、C++はさまざまな言語の要素を持っているので。たとえば: …