1 名前:デフォルトの名無しさん mailto:sage [2006/03/12(日) 16:08:39 ] おそらく、.NET開発でデファクトスタンダードに最も近い であろうC++/CLIについて語ろうぜ! このスレはC++および.NET Frameworkについて一定以上の知識を持っている人が対象となります。 .NETのクラスライブラリの使い方といった質問は姉妹スレ「くだすれC++/CLI(初心者用)」に お願いします。 前スレッドはこちら (p)pc8.2ch.net/test/read.cgi/tech/1126450441/l50 姉妹スレ くだすれC++/CLI(初心者用) (p)pc8.2ch.net/test/read.cgi/tech/1142144110/l50 managed C++ やろうぜ!! 002 (p)pc8.2ch.net/test/read.cgi/tech/1139043535/l50
309 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 01:37:21 ] >>308 ありがとうございます。 すみません。問題は別のところにありました。 実際は*bufは関数でネイティブに渡していて、そこにそのまま渡していたという初歩的なミスです。 void nativefunc(byte **buf_p, size_t *size) { //--- nativefunc(byte *buf_p, size_t *size) これで宣言していた *size = bitmap.size; byte *data = new byte[*size]; memcpy(//--- データ書き込み *buf_p = &data[0]; //--- cliのbufのアドレス書き換え } void clifunc() { size_t size; byte *buf; (new NativeCls)->nativefunc(&buf, &size); //--- nativefunc(buf, &size); そのまま渡していた cli:array<unsigned char,1> ^arr = gcnew cli:array<unsigned char,1>(size); System::Runtime::InteropServices::Marshal::Copy((IntPtr)buf, arr, 0, size); }
310 名前:デフォルトの名無しさん [2007/06/21(木) 00:39:09 ] String a("A"); これがコンパイルできないのはなぜですか? error C3149: 'System::String' : トップレベルの '^' なしに、この型をここに使用することはできません
311 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 00:46:21 ] トップレベルの '^' なしに、この型をここに使用することはできないから。
312 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 01:45:46 ] >>311 その理由を聞いています。
313 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 07:33:41 ] 仕様だからとしか
314 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 08:49:15 ] 仕様ですか。しかしObjectやStringBuilderなどは^がなくてもOKなので、 Stringのみ特別な事情があると理解すればいいでしょうか?
315 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 09:20:15 ] MSDNには対象外としか書いてないね。 The following reference types are not available for use with stack semantics: delegate / array / String 予想だけどこれらはIDisposableでないので出来ても意味が少ない。 出来たとしてもハンドルに変換しないと使えない。 String s("A"); String^ x = "abcd" + %s; String^ x = "abcd" + s.ToString();
316 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 10:55:52 ] >>315 ありがとう。 使い道がないということで理解しようと思います。
317 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 17:45:52 ] delegateは知らんが、arrayやStringは.NET ILレベルで特別扱いしてるからかもな。
318 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 09:16:58 ] VC2005でデバッグしてるとステップ実行で変なところを さしてしまう場合があってデバッグしづらいんですが 直す方法はありますか? nop命令があってそこでへんなとへこいきます。
319 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 05:55:39 ] GUIなアプリケーションを作るために C#の「Windowsアプリケーション」プロジェクトでいくか C++/CLIの「Windowsフォームアプリケーション」プロジェクトで行くか悩む。 アンマネージドなC++クラス(とboost)で書かれたCUI アプリケーションのGUI版を作ろうとしています。 C# でもアンマネージドな DLL のエントリを呼び出すことできますし。 でもアンマネージドな C++ のクラスを使いまくりたいんだけど どうしたものか・・・ COM コンポーネントとして作られていれば 容易に扱うことができたのかもしれないけど。 アンマネージドな C++ で書かれたクラスのインスタンスを 生成したい時って、そのクラスのファクトリメソッドを 用意しておいてそれを C# 側から呼び出すということになるんですかね? C++ 特有の複雑な(引数の型を反映した)関数名とかどうなるんだろう。 extern "C" つかうのか。
320 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 05:56:10 ] ごめん、書いてる途中で C# な話題になってしまった。
321 名前:319 [2007/07/06(金) 06:41:49 ] それで、肝心のことなんですが、アンマネージドな C++ のクラスを .NET 環境で使うためには C++/CLI でラッパークラスを書けば いいのでしょうか?そうするとマーシャリングなども自動で やってくれるということなのでしょうか? DLL は C++ にやさしくない、かといって COM コンポーネント として書いてしまうとプラットフォームに強く依存しすぎるので 一般的な用途のクラスライブラリには向かない、 でもアンマネージドな C++ のクラスを .NET と仲良くさせたい、 という課題をどう解決すればいいのかを教えてください。
322 名前:デフォルトの名無しさん mailto:sage [2007/07/06(金) 08:19:58 ] > そうするとマーシャリングなども自動で > やってくれるということなのでしょうか? そういうことになるが、ある意味自分で マーシャリングコードを書く補助をしていると言ってもいいかもしれない。 アンマネージクラスをC#(やその他.NET言語)から呼び出したければ、 C++/CLIでそのクラスをラップしたマネージクラスを含むマネージドDLLを作って、 他の言語から参照設定して使うのが一番率直な手段。 そもそもC#でアンマネージDLLのC++クラスを操作するなんて不可能だぞ。 (COMインタフェース経由を除く)
323 名前:319 [2007/07/06(金) 10:57:16 ] >C++/CLIでそのクラスをラップしたマネージクラスを含むマネージドDLLを作って、 >他の言語から参照設定して使うのが一番率直な手段。 やっぱそうですか、ある意味安心しました。 System.Runtime.Interop 以下にいろいろあるのを眺めてて、 もしかしてマネージドからなんかうまい具合にごにょごにょ できる方法が用意されてるのかなぁ、などと疑心暗鬼になってました。
324 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 13:26:04 ] VC2005でデフォルトのフォームアプリを作成して、 CLRサポートを/clrにして以下のインクルードを追加すると 実行時ヒープエラーみたいなのが出ます。 #include <comdef.h> #pragma comment(lib, "oleaut32.lib") どうやって直したらいいのでしょうか?
325 名前:デフォルトの名無しさん [2007/07/24(火) 03:07:41 ] なんで Void って大文字になったの?
326 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 03:13:36 ] ヘミvoidが権利を主張するのを避けるため
327 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 23:16:42 ] System::Void のこと?
328 名前:デフォルトの名無しさん mailto:sage [2007/07/24(火) 23:50:23 ] 当たり前のことなんだろうけどvoid代わりに使えるのが少し不思議に感じる。 #include <cstdlib> int main() { System::Void* pv = std::malloc(256); std::free(pv); }
329 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 02:28:58 ] 自分自身の起動パスを得るにはどうしたらいいの?
330 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 13:29:14 ] CRTの__argv[0]やWin32のGetModuleFileName(0,とか .NETのSystem::Windows::Forms::Application::ExecutablePathなど。
331 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 22:11:43 ] Applicationにあったのか! ありがとう。 ずっとProcessとかを探してたよ Win32APIのときGetModuleDirectoryとかなんとかだったから
332 名前:デフォルトの名無しさん mailto:sage [2007/07/25(水) 22:51:56 ] >>331 その線も惜しい。 Win32はGetModuleFileNameだったでしょ。 .NETだとモジュール (EXE/DLL)に対応するものはアセンブリだから、 その方向でやるならAssemblyクラスが正解だった。 www.atmarkit.co.jp/fdotnet/dotnettips/016exepath/exepath.html
333 名前:デフォルトの名無しさん [2007/07/27(金) 12:14:00 ] Visual Studio 2005 で C++/CLI を使おうとしています。 std::vector<System::String^> のように標準のSTLのコンテナには ハンドルを格納することはできないのでしょうか? C++/CLI にはマネージドな世界独自のコンテナクラスライブラリが 用意されているのでしょうか?今の自分は array<String^> しか使えずさみしい毎日を過ごしています。 std::vector<System::String^>^ lines; try{ for(;;) lines->push_back(stream_reader->ReadLine()); } catch 以下略 のようにぶん回してファイルを行単位で全行 読み込みたいだけなのですが・・・
334 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 12:19:12 ] >>333 >C++/CLI にはマネージドな世界独自のコンテナクラスライブラリが つSystem::Collections::Generic STL.NET構想はどっかいっちゃったけどな
335 名前:デフォルトの名無しさん [2007/07/27(金) 12:26:29 ] >>334 おお、「コレクション」というのですか。 どうりで C++ CLI コンテナ で検索していても 昔の managed C++ の資料や gcroot でがんばる という方法しか見つからず難儀していました。 しかも cliext::vector なんかも見つかってしまい、 余計に混乱していました。cliext 名前空間以下の 識別子ってのが STL.NET なんですかね?
336 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 12:42:30 ] >335 STL.NET は STL/CLR という名前で VS2008 に同梱 ただ、.net fx 2.0 では動かない こういう後方互換性がないものを C++/CLI で出してほしくなかった
337 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 12:47:04 ] >後方互換性 上位互換が無いってことか?
338 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 12:49:22 ] >>336 それで困るやつはどれだけいるんだ
339 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 12:51:29 ] STLってのはC++では最重要なんだが...
340 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 12:55:13 ] >>336 それ本当? .NET Framework 3.0も3.5もCLRのバージョンは2.0のままだろ。
341 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 13:07:08 ] .net fx 2.0 で作ってた既存アプリに STL/CLR を使って修正すると、アプリの実行に 3.5 が必要になるのは嫌じゃね? 前のCTPの頃はライブラリだけ持って行けばよかったんだが
342 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 13:22:05 ] >340 Beta1 で Microsoft.VisualC.Stlclr.Dll +ヘッダ抜き出しで駄目だったという報告があった とりあえず、Beta2 が来てるんで、入れて試してみる 一応、「Microsoft.VisualC.Stlclr.Dll は .net fx 3.5 の一部ではない」はずなんだが
343 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 13:47:59 ] >>341 >.net fx 2.0 で作ってた既存アプリに STL/CLR を使って修正すると、アプリの実行に >3.5 が必要になるのは嫌じゃね? >前のCTPの頃はライブラリだけ持って行けばよかったんだが コンパイルし直すんだろ? どうせmsvcp90.dllとか増えてるんじゃないの? VC++のランタイムライブラリに同梱ってのが幸せになる道かねぇ。 まあ3.5のサイズにもよるな。
344 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 14:43:50 ] >343 客先に説明するのが面倒なんだよね。でも、STL/CLR は使いたい できれば、CTP同様に VS2005 + ヘッダ + Microsoft.VisualC.Stlclr.Dll で STL/CLR を 使った開発ができる方がうれしい。SP2 で来ないものかな
345 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 17:14:22 ] std::vector<int> v; : for each(int i in v) {} for eachでbegin(), end()が呼ばれているようですが ECMA-372にはこの振る舞いの記述が見あたりません。 MSの独自拡張なのでしょうか?
346 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 00:28:26 ] >345 これでも行けますね int vec[] = { 1, 2, 3, 4, 5 }; for each ( int num in vec ) { std::cout << num <<std::endl; } 配列アクセスが可能なものは Array のラップを掛けて渡されているのでは ないでしょうか。Array は IEnumerable ですし
347 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 00:34:44 ] >346 ごめん。これはできて当たり前だわ array<int>^ vec = { 1, 2, 3, 4, 5 }; と同等だもんな
348 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 07:12:42 ] >>346 Cタイプ配列とarray<T>は同等じゃないから346は通らないのでは?
349 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 07:20:17 ] std::vectorに対するfor each inはネイティブでコンパイルしても使えてるな。 /Zeで拡張構文を抑制するとeachが構文エラーになった。 // cl /EHsc hoge.cpp #include <iostream> #include <vector> int main() { std::vector<int> v; v.push_back(1); v.push_back(5); for each (int i in v) std::cout << i << std::endl; return 0; }
350 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 18:16:58 ] >348 Cタイプ配列は C++/CLI では array<Type> でラップされるよ。だから、346 は動く >347 がそれを言ってる ヘッダ見たけど、特に ecma-372 で必要とされている IEnumerable の定義も 見あたらないから、CLR・・・で定義されている所に、拡張構文で潜んでるっぽい
351 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 18:24:10 ] VS2008 Beta2 試してみた。コンパイル対象となる .net fx が選べるようになったんだが 2.0, 3.0 を選んだとき、STLCLR.dll は使えなかった STL/CLR を使いたかったら、3.5 を普及させろと言うことらしい ( ゚д゚) Feedback マンドクサ _(__つ/ ̄ ̄ ̄/_ \/ /  ̄ ̄ ̄ ( ゚д゚ ) _(__つ/ ̄ ̄ ̄/_ \/ /  ̄ ̄ ̄
352 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 19:47:41 ] >>350 C#のCタイプ配列はCLR配列だが、C++/CLI のCタイプ配列はCLR配列じゃないぞ。 >>346 を実際にコンパイルしてみろ、C3285でしっかりコンパイルエラーが出る。
353 名前:デフォルトの名無しさん mailto:sage [2007/07/28(土) 23:12:16 ] VC8 SP1で試したけど/clrの有無に関わらずC3285になるね。 当たり前だけど、boost::arrayはOK。 どうせならレンジに使えればいいのに、 ってそれなんてBOOST_FOREACHなんだけどね。
354 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 14:40:44 ] >352-353 悪禁食らっていたので返答が遅れた ごめん。漏れが試したのは、VS2008 Beta2 だった。こちらは >346 でコンパイルできるし 動く。また、ecma-372 でも、仕様上 346 で正しいから、VC8 で取りこぼしてた仕様が いくつかあったやつを VC9 で準拠したんだと思う /clr の有無に関わらずって、/clr なくて for each が使えるの?
355 名前:名無しさん@そうだ選挙に行こう mailto:sage [2007/07/29(日) 19:24:33 ] >>354 349でネイティブでも使えるという報告があるよ。
356 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 14:40:51 ] ファイル名をキーとするstd::mapのようなものを作りたく、Generic::Dictionaryのキー型にString^ 比較にStringComparer:::CurrentCultureIgnoreCaseを指定してるのですが 全角アルファベットの大文字・小文字も同一視されてしまいます。 要するにNTFSやFATと同じようなファイル名の比較をしたいのですが、どうすればいいんでしょうか?
357 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 15:16:49 ] つ ネイティブC++
358 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 15:50:00 ] >>356 WindowsのNTFSファイルシステムドライバは"A"と"a"は同じ文字とみなしてるよ?
359 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 16:11:47 ] >>358 あ、ほんとだ。区別されるものと思ってた。
360 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 10:22:34 ] >>356 カーネルの中には比較する関数あるんだけどね・・・ なんでユーザーモードに無いのかは謎 まじめにやると日本語やアルファベット以外の文字(ヨーロッパ圏など)でも 全角半角を問わず大文字小文字を区別しないので 割と面倒だった気がする。
361 名前:デフォルトの名無しさん [2007/08/01(水) 04:25:12 ] Visual Studio 2005 で C++/CLI を使っています。 フォームデザイナの機能で C++/CLI と C# の間に 違いはあるのでしょうか? つまり C# でのフォームデザイナと、C++/CLi での フォームデザイナの間に、利用できるコントロールの 種類などで違いがあるのでしょうか? .NET Framework で用意されている機能なら言語によらず 利用可能だとおもうので差はないと思っているのですが。
362 名前:デフォルトの名無しさん [2007/08/01(水) 04:54:48 ] マネージドなプログラム組むならC++なんか使わねっつの!w
363 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 08:38:47 ] >マネージドなプログラム これってメリットある? いや、一般論じゃなくて実際のところ。
364 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 09:07:42 ] プラットフォームにVistaが使えるじゃねーか。
365 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 09:14:12 ] いや、Vi$taにあうのはネイティブアプリ。
366 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 11:44:46 ] >>363 自分専用ツールにはクラスライブラリが充実しているので便利。
367 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 12:01:52 ] >>366 それにしては、Win32で出来るものが出来なかったり、中途半端。 だったらVCLみたくネイティブクラスライブラリ充実させろよ。
368 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 12:05:21 ] >クラスライブラリが充実しているので これって、ネイティブ版クラスライブラリを作成すれば完璧だおね。 M$のドトネト囲い込み戦略に嵌められてるだけじゃないの? ドトネトは終焉したわけだし、無視した方が良いよ。
369 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 12:37:37 ] ドトネト君っていろんなスレにいるな。 飽きないの?
370 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 13:00:03 ] >プラットフォームにVista つ ttp://gigazine.net/index.php?/news/comments/20070801_will_not_move_to_vista/ 企業ユーザーの大多数はVistaへの移行を考えていない
371 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 16:47:45 ] そりゃ、CreateFile系のAPI自体がバグでロックしちゃうんだもの。 企業ユーザが使おうとするわけがない。 >> VISTA
372 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 17:10:29 ] >CreateFile系のAPI自体がバグでロックしちゃうんだもの。 kwsk
373 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 17:12:17 ] これか ttp://d.hatena.ne.jp/NyaRuRu/20070731/p2
374 名前:デフォルトの名無しさん [2007/08/01(水) 22:23:38 ] Form.hに実装を書かせられるの嫌なんだけど、どうにかならない? てか、なんでForm.hに実装させるような仕組みにしたんだろう?
375 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 23:02:47 ] Form.cppに実装を移せば?
376 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 23:59:06 ] 実装を書かせるといっても、イベント用に開発環境が自動生成したものですよね。 これをcppにということになると、たとえば、フォームデザインの変更を ちょこちょこやる場合、Formのデザイナとヘッダとcppを行ったり来たりでは やっぱり大変だよね。
377 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 00:59:04 ] ぶっちゃけVC++8の.NETサポートは「諦めろ」としか言えないよ・・・
378 名前:デフォルトの名無しさん [2007/08/02(木) 04:03:15 ] VC++9 では何か変わってるの?
379 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 09:44:37 ] そりゃ変わってますよw
380 名前:デフォルトの名無しさん [2007/08/02(木) 18:35:26 ] VC2008先行して使っている人、 デサイナが生成するコードに何か大きな変化は有りましたか?
381 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 21:36:34 ] 試してみたけど変わってないみたいだね。残念だ…
382 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 22:27:36 ] C++/CLI に関してはろくに対応されていないね。STL/CLR なんか作ってる場合じゃないと 思うんだが。結局、ネイティブ・アプリの ClickOnce 対応もしていないし
383 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 22:53:42 ] いや、STL/CLRは「ろくな対応」なんじゃないか?
384 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:11:20 ] ネイティブの STL にマネージド・オブジェクトが格納できればいらない対応でしょ むしろ、2種類のライブラリに混乱しかねない
385 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:41:52 ] マネージドなSTLはそれになりに便利だと思う。 標準C++ & boost萌えな俺には、C++/CLIやC#はきついんだが…
386 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 08:17:10 ] >>384 確かに。少なくともクラス定義だけでも、 ネイティブクラスと値クラスに違いがなければいける。 前にも書いた気がするけど、ハンドル用のアロケータ書いてみたが、 ネイティブクラスはハンドルを持てないのでだめだった。
387 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 08:27:31 ] C++0x の concept map が C++/CLI に実装されたら、それつかって managed class を STL コンテナにいれられるのでは...
388 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 10:16:37 ] だとしたら、ほんとに STL/CLR は C++0x が確定するまでの繋ぎでしかなくなるな
389 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 11:18:52 ] いや、一応STL/CLRは一度覚えればC#でも使えるんだろ?
390 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 11:21:41 ] STL/CLR は C++/CLI せんよーだってさ テンプレートで実装してるしね
391 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 11:22:36 ] じゃあ、意味ねーなw
392 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 11:33:20 ] なんかグダグダ
393 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 16:46:48 ] でもまだSTL/CLRのコンテナは、System::CollectionsやSystem::Collections::Genericの インタフェースを実装しているのが強みと言えるかもしれない。
394 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 16:51:41 ] STLがあればGenerics要らんやん。
395 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 17:49:38 ] C# にも展開してくれれば良かったんだけどなぁ
396 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 00:58:40 ] まぁどっちかっつーと.NET言語の態勢を保ちつつ コンパイル時のコード生成であるC++テンプレートをサポートするってのが 端から無茶やってるとは思うけどねぇ。
397 名前:デフォルトの名無しさん [2007/08/04(土) 13:00:12 ] C++/CLIでは stringstream に相当するものは用意されているのでしょうか?
398 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 13:03:09 ] .NETのクラスライブラリにはMemoryStreamが似ている存在。 でもstringstreamだって使いたければ使えばいいし。
399 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 15:31:51 ] StringBuilder や StringReader, StringWriter を使ってもいいな
400 名前:デフォルトの名無しさん [2007/08/04(土) 23:23:24 ] C++/CLIでも派生させるクラスのデストラクタはvirtualにすべき? 勝手になる?
401 名前:397 [2007/08/04(土) 23:41:29 ] 長さの単位がString,StringBuilderはInt32でStreamはInt64くさいけど System::IO::Streamとしても使いたかったんで MemoryStreamから派生することにした。 順序つきで使える operator >> は面倒だからやめた・・・。 generic <typename T> MyStringStream% operator << (T x) { cli::array<unsigned char>^ buffer = System::Text::Encoding::Unicode->GetBytes(x->ToString()); this->Write(buffer,0,buffer->Length); return *this; }
402 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 00:21:56 ] >>400 ポインタを使った場合だと、virtual 付けないとダメね ハンドル型だと、virtualなしでもいける
403 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 00:23:24 ] >>402 へえ、boost::shared_ptrみたいだな
404 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 00:26:44 ] 「リソース管理できてデストラクタに罠がない賢い手段」 目指してるものが同じだからな。
405 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 00:54:52 ] >>402 トンクス!
406 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 01:28:41 ] ハンドル型っていまいち概念がわからん。 マネージドヒープにある実体を指すポインタなんだろうか?
407 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 01:35:03 ] ガベコレの都合から考えたほうが早いかも
408 名前:デフォルトの名無しさん [2007/08/05(日) 02:07:15 ] ref class だと デストラクタってDisposeじゃなかった? だからvirtualにならないとつじつまが合わない気が・・・
409 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 05:28:45 ] >>408 ref classのデストラクタはDispose()ナマじゃなからvirtualかどうかは意味がない。 デストラクタを宣言すると暗黙でDispose(bool)とDispose()とFinalize()が定義されて、 デストラクタはDispose(bool)から間接的に呼ばれるので、 結果、継承ツリーの下位のほうから順にデストラクタが呼ばれる形になる。