2010-08-08

プログラミングの魔導書 Vol. 1のレビュー

株式会社ロングゲート - 製品案内

プログラミング雑誌が正式に公開されたので、レビューでもする。ただし、私は常に、何事にも批判的な目を向けているので、自然とレビューも、辛口になってしまう。

Bjarne Stroustrupへのインタビュー 著者:本人

私が書いた。タイトル通り、C++の設計者にして最初の実装者であるBjarne Stroustrupへのインタビュー。C++0xについてと、C++の教育について論じている。

boost::serializationの紹介 前編 著者:近藤 貴俊

これもタイトル通り、Boost.Serializationの入門。

Variadic Templates お前を待っていた 著者:Egtra

Variadic Templatesを使って、Win32 APIのEnum系のAPIのラッパーを作る。あまり宜しくない。まあ、斬新な実装だとは思うけどさ。Variadic Templateをユーザーが直接使う必要はないだろ。それに、記事では結局、Enum系APIをそれぞれ個別にラップしていることには変わりないわけだ。じゃあ、これでいいじゃないか。

namespace Ezoe
{
    namespace detail
    {
        BOOL CALLBACK EnumWindowsProc( HWND hwnd, LPARAM lParam )
        {
            auto func = *reinterpret_cast< std::function< bool (HWND) > * >( lParam ) ;
            return BOOL( func( hwnd ) ) ;
        }
    }

    bool EnumWindows( std::function< bool (HWND) > proc )
    {
        return bool( ::EnumWindows( &detail::EnumWindowsProc, reinterpret_cast<LPARAM>(&proc) ) ) ;
    }
}

使い方

// std::coutに流しこむ
void f()
{
    Ezoe::EnumWindows(
        []( HWND hwnd ) -> bool
        {
            std::vector<char> buf( ::GetWindowTextLengthA(hwnd) + 1 ) ;
            if ( ::GetWindowTextA(hwnd, &buf[0], buf.size()) > 0 )
            { std::cout << &buf[0] << std::endl ; }

            return true ;
        }
    ) ;
}

// std::wstringのstd::vectorに流しこむ
void g()
{
    std::vector< std::wstring > v ;
    Ezoe::EnumWindows(
        [&]( HWND hwnd ) -> bool
        {
            std::vector<wchar_t> buf( ::GetWindowTextLengthW(hwnd) + 1 ) ;
            if ( ::GetWindowTextW( hwnd, &buf[0], buf.size() ) > 0 )
            { v.push_back( std::wstring(&buf[0]) ) ; }

            return true ;
        }
    ) ;
}

Variadic Templatesは、確かにすばらしい。しかし、Joe Coderが使う必要はない。結局、この記事が何をしているかというと、劣化std::functionの実装なのだ。だったら最初から、std::functionを使えばいいのだ。Variadic Templatesは、いうなればアセンブリ言語である。アセンブリ言語はプロでなければ使えないように、Variadic Templatesも、プロが使うべきなのだ。それに、結局Boost.Fusionを使っているのであれば、Variadic Templatesを使う意味がそれほどあるとも思えない。他人の書いたマクロに頼って、マクロアセンブラーでアセンブリを書くようなものである。なおさら自分でVariadic Templatesを使う意味がない。Variadic Templatesは、std::fucntionを実装するためにあるのだ。

私の実装では、コールバック関数として、std::functionが渡せる。シグネチャは、引数からLPARAMを取り除いた形だ。コールバック関数としてstd::functionを渡せるようになれば、関数オブジェクトが渡せるというわけだから、可能性は無限だ。

Chronoライブラリで考える型システム 著者:melpon

C++の強い型システムの中で、単位を実装する話。1秒 + 1秒は、2秒になってほしい。しかし、1秒 + 1分は、61秒になって欲しい。これは、秒と分とは、時間という概念を指すのだが、単位が違うためだ。分とは、ご存知の通り、60秒のことである。

C++0xの新しいライブラリであるratioを引き合いにだしながら、単位をC++の型システムの上に落としこむ方法を論じている。

オーブンレンジクッキング 著者:高橋 晶

物事を広く浅く紹介するのは、アキラさんの十八番である。この記事では、Ovenという、変態的なライブラリについて述べている。このライブラリは、まあ、関数型言語の原理主義者には、好まれるのかもしれない。私は使いたくないが。

Hello, C++ World! 著者:稲葉 一浩

Let's Boostという、まあ、言い方は悪いが、猫でも分かる(笑)のBoost版のようなWebサイトの中の人。

単純なHello,worldプログラムに、以下にC++の複雑なしくみが潜んでいるかというお話。まあ実際、Hello,worldごときにADLを使うようなC++は、異常だと言わざるをえない。

Crawling in the Stream 著者:zak

この雑誌のイラストを描いた人。iostreamについて、型の如く説明している。まあ、iostream自体、プログラミングを勉強するときぐらいしか使わないから、あまり価値はないと思うのだが。

メタプログラミングノキワミ アッー! 著者:DigitalGhost

日本人で唯一、Boost.Preprocessorの実装を理解している人間。この記事では、一般人を対象とするため、嫌々ながらBoost.MPLを使っているが、おそらく彼の本心では、プリプロセッサーだけでやりたかったに違いない。

Boost.AsioによるHTTP通信入門 著者:clown

題名通り、Boost.Asioによるネットワークプログラミングの入門。Boost.Asioの実装はなかなかすばらしいので、是非とも使うべきだと思う。Windows環境でネットワークプログラミングをするのに、WinsockとIO completion portを直接書いたことのある身として、特にAsioを進める次第。

でも、実際に、移植を考える必要がなく、Windows環境だけでネットワークプログラミングをやれと言われたら、多分私は、Vista以降のthread poolを使って、結局IO completion portを直接使って実装するだろうと思われる。別に、IO completion portは難しくない。それよりiostreamの方が難しい。なにより、日本語がまともに使えないので、意味がない。

C++の歴史 著者:本人

私が書いた。コンセプトとしては、D&Eに載っていない、すなわち、D&E以降のC++の歴史の話である。D&Eが好きな人は、楽しめるだろう。

BoostCon2010体験記 著者:近藤 貴俊

BoostCon 2010の参加してきた近藤さんの体験談。いかにもステレオタイプな日本人っぷりをアピールし、以て外人をして日本人のイメージを一層固定化せしめることに尽力したらしい。それにしても、BoostConに参加したとはうらやましい。カネさえあれば私も行きたい。

1 comment:

履歴書の添え状 said...

いつも楽しく観ております。
また遊びにきます。
ありがとうございます。