...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

ダックタイピングを中心に据えたC++入門

というのはどうだろう?
そう,最初からテンプレートありきでC++に入門するということだ.

#include <iostream> // std::cout をを使うとコンピュータに宣言
void main() {    // プログラムが始まる場所
  std::cout << "Hello world!";  // Hello world! と画面に表示する
}

の次に

#include <iostream>

// say(...)の...の部分を表示してくれるもの
template <typename ArgmentType> void say(ArgmentType arg) {
  std::cout << arg; // sayの中身は実はこれでした
}

void main() {
  say("Hello world!"); // say は何かを表示してくれるものなので Hello world! を表示してとお願いした
}

こんなもんだろうか.
うーん,これだったら文字数が少ない分(というか概念の要素数が少ない分),rubyの方がいい気がしてきた.
(追加→)だってtemplateとかtypenameとかはやりたいことに対して余計な概念/記述じゃん?


ちなみに,printfはフォーマット指定子を説明しないといけないのであえて使わない.
数値と文字列の違いくらいはこの後で説明しないといけないが,変数が出てくるまではまだ型を知ってもらう必要はなさそう.
(追加→)ていうかそもそも変数の説明をする前にargの役割を理解することはできるのか? 無理っぽいのだが.

追加

for文(というか繰り返し処理)の説明を,変数を使わずにしようとしてみたら,ブロックが受け取れなくて泣いた.
反復回数はリテラルで指定すればいいので,ループ変数がいらないから,まだ変数はいらない.
でも反復する処理自体はどうしようもない・・・.
せめてsayが引数を取らなければこれでいいのだが.

#include <iostream>
#include <algorithm>

template <typename ArgmentType> void say(ArgmentType arg) {
  std::cout << arg;
}

void main() {
  std::for_each(0, 10, say えーっと... ) // 0から9(=10-1)までの10回sayを繰り返します
}

いきなり BOOST_FOREACH の出番か!?どんな入門やねん!って思ったけど,あれも変数ないとだめか.
反復範囲をrangeオブジェクトを介して与えてやればなんとかなるような気もしないではないが・・・.
C++0xだったらUniform Initializationとかで何とかrangeオブジェクトの存在を隠せるかもしれない.
http://d.hatena.ne.jp/faith_and_brave/20080625/1214384049

追加

あれ?
そもそも制御構文を説明するために変数を説明しないでやろうと思っていたのに型の説明まで一緒に省こうとしてたので修正した.

型と変数の説明を分離しようと思ったら,variant型みたいなものを使う必要があるのかな?
それなければこうか?

//say(arg1,arg2) で arg1 + arg2 の答えを画面に表示してくれるもの
template <typename T > void say_add(T left, T right)
{
  T result = left + right; // 計算の答えにresult
  say(result);
}
void main() {
  say_add(1,2); // 1と2を足した答えは?
}

うーん・・・これは・・・w
やっぱ Type value; と書かなければいけない限り分けた方がわかりにくいから無理!