上の記事を読んで、一瞬VS2005を買うのをやめようかと思った。なにやらあつい口調で語っているけれど、全然凄くない。
C++を.NETの世界に持ち込むなら、マネージ拡張までは自然だと思うのだ。でも、マネージド/アンマネージドの混交さえできるなら、C++使いの発想として当然、C#のusingによるリソース管理の代わりとしてテンプレートでIDisposableをデストラクタで解放するスマートポインタを書くだろうし、というか、何でM$はそういう当然のライブラリを付けないで、今更余計な言語拡張してるの? と思った。
for eachも要らないと思う。boost::lambdaで十分でしょ? それよりboost::lambdaを安心して使い倒せるようにテンプレートの実装をもっとまともにしてくださいな。VC++ 7.1は随分ましになったとはいえ、さぁ。
マネージド/アンマネージド混交を許すのは技術的には凄いとは思うのね。でも、この記事からではそれ以上に凄い部分が見えてこない。マネージドな参照とアンマネージドな参照を区別する記法って本当に必要? .NETオブジェクトをネイティブC++から扱えるのは凄いよ。でもそれさえできれば、敢えてそれ以上言語機能を弄くる必要は無いんでない? 精々が、特殊なスマートポインタじゃ何かまずいの?
ライブラリでできることを言語本体に組み込んでも、今まであんまりいいことは無かったように思うんだけどね。いや、それを突き詰めると全部Lispになっちゃうんだけどね。でも、このままではVC++がだんだんVBになっていく。.NET/CLIを本気で作ってしまったM$の技術力は否定しないけれど、殊この代物に関しては技術力を何か違う方向に使ってしまっている気がしてならない。
コメントありがとうございます。
> ついでにマネージドな参照も別記法に
そう考えると自然ですね。恥ずかしながら、その話は初耳でした。参照記法については結構納得できたと思います。
マネージドオブジェクトをローカル変数として使える利点をあまり感じないのは、私がこのところJavaに浸かっていてひたすらnewするのに抵抗を感じないというのもあるのかもしれませんね。実際にはオブジェクト本体をスタックには置けないんでしょうし、newする手間よりは、言語機能の更なる肥大のほうがどうしても気になってしまいまして。
でも、ライフサイクルを鑑みてより自然な記法はローカル変数なのですよね。boost::scoped_ptrみたいなのは、所詮は自然な記法に近づけるための苦肉の策な訳で。
うーん。何だか、考えが変わってきました。この記事に書いた意見は大部分撤回かも知れません。
初めに仰っているtemplate/genericの問題は、まぁ、CLIにおけるgenericの仕様とネイティブコードに落ちるtemplateとの差を考えればそういう仕様にしたくなる気持ちも分かりますけれど、確かにそういうところこそ技術力でなんとかしてもらいたいですね。せっかくCLIとシームレスに統合できたのにそこだけ中身が見えてしまっている感じで、言語としては不自然ですものね。
よくわからない理由により、コメントが即座には反映されないかもしれませんか゛、ボタンを押して元の画面に戻ってきたならたぶん正しく送信されています。
私はtemplateと別にgenericが導入されるというのが1番気に入りません。
genericでは特定のインターフェイスを実装していなければならないというような拘束を与えられるようですが、
templateにはコンセプトを導入しようというC++ 0xの流れもあるのにこれはただの無駄でしかないと思います。
マネージドな参照とアンマネージドな参照が別記法なのは、
従来のポインタ同士では演算子オーバーロードができないのでマネージドポインタはアンマネージドポインタと別記法にして、ついでにマネージドな参照も別記法にしたとどこかで読んだ気がします。
それはともかくとして、私はマネージドオブジェクトをローカル変数として使えるのは便利だろうと思っています。
そのためにはIDisposableとデストラクタのことも必要でしょうと考えています。