<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++/CLI</title><link>http://blogs.wankuma.com/hirase/category/1834.aspx</link><description>C++/CLI</description><managingEditor>T.Hirase</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>T.Hirase</dc:creator><title>[C/C++/CLI/C#] 二値Enum型を作りたい。 </title><link>http://blogs.wankuma.com/hirase/archive/2009/07/30/179566.aspx</link><pubDate>Thu, 30 Jul 2009 23:39:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2009/07/30/179566.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/179566.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2009/07/30/179566.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/179566.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/179566.aspx</trackback:ping><description>&lt;p&gt;うすたー：&lt;a href="http://blogs.wankuma.com/hirase/archive/2009/07/17/177879.aspx"&gt;[C#] Enumを二値扱いたかったりする。&lt;/a&gt;&lt;p&gt;
&lt;p&gt;うすたー：&lt;a href="http://blogs.wankuma.com/rti/archive/2009/07/27/179358.aspx"&gt;Enum で bool 型を使いたい時って？&lt;/a&gt; (R.Tanaka.Ichiro's Blog)&lt;p&gt;
&lt;p&gt;前回の記事があまりにひどいできだったので、やり直します。&lt;/p&gt;
&lt;h3&gt;戻り値はtrue/falseでいいですか？&lt;/h3&gt;
&lt;p&gt;たとえば、データの書き込み関数「&lt;code&gt;TryWritingBytes&lt;/code&gt;」を考えます。バッファリングやハードウェアの都合上、書き込みには失敗する可能性があります。&lt;/p&gt;
&lt;p&gt;以下に、&lt;code&gt;TryWritingBytes&lt;/code&gt;関数の使用例を示します。同関数の実装は省略。&lt;/p&gt;
&lt;pre class="c" xml:space="preserve" name="sourceCode"&gt;extern bool TryWritingBytes(void * data, size_t size);

int main()
{
	// something to do.
	
	if (TryWritingBytes(data, size)) {
		// 成功時の処理
	} else {
		// 失敗時の処理
	}
	
	// something to do.
}
&lt;/pre&gt;
&lt;p&gt;この&lt;code&gt;TryWritingBytes&lt;/code&gt;の戻り値は、書き込み成功時に&lt;code&gt;true&lt;/code&gt;を返す仕様になります。が、こういう「成功=Trueだな」みたいに、経験十分プログラマ的な感覚で決められた関数って、危ういと思います。みんながみんな経験十分プログラマとは限らないからです。&lt;/p&gt;
&lt;h3&gt;成功不成功という値を作るべし。&lt;/h3&gt;
&lt;p&gt;そんなわけで、trueがどっちを表すかなんて、不毛な議論やコメントを書くくらいなら、さっさと別の二値型を作って、読む人も書く人も間違えないようにすべきです。&lt;/p&gt;
&lt;p&gt;そんなこんなで、このコード：&lt;/p&gt;
&lt;pre class="c" xml:space="preserve" name="sourceCode"&gt;enum IsSuccess : bool {
	Success,
	Failed
};

extern IsSuccess TryWritingBytes(void * data, size_t size);

int main()
{
	// something to do.
	
	if (TryWritingBytes(data, size) == Success) {
		// 成功時の処理
	} else {	// Failed
		// 失敗時の処理
	}
	
	// something to do.
}
&lt;/pre&gt;
&lt;p&gt;こんな言語仕様あった方がいいと思いません？&lt;/p&gt;
&lt;h3&gt;補足&lt;/h3&gt;
&lt;p&gt;先の記事で、私、「true/falseを別名で扱いたいだけです」と書いていますが、考え直したところ、全然ダメです。true/falseを別名で扱うこともやはり手段であって、目的ではないですし、仮にできたとしても、所詮別名、成功不成功を表す別名にtrue/falseを代入できてしまいますから。&lt;/p&gt;
&lt;p&gt;なので、やっぱり、二値Enum。&lt;/p&gt;
&lt;p&gt;また先の記事のコメントやトラックバックで、いくつか代替方法をいただきましたが、やはり私を含む経験不足プログラマが見てもわかりやすい方式（二値Enumに限らず）が言語仕様に組み込まれる方が良いと思います。&lt;/p&gt;
&lt;p&gt;ちなみに、別に今回の二値Enumがベストな解だとは思っていません。&lt;/p&gt;
&lt;p&gt;あとあと、最後に。他にも言語仕様に不満ってありません？　っていうか何でテキストエディタなんだよ？　とか。クラスのメソッドを編集するのに、どのファイルを開けばいいかなんて、覚えるのなんて意味ないよ？　とか。もっと自由にやらせろ、的な。&lt;/p&gt;

&lt;h3&gt;追記＠2009-07-30T23:40&lt;/h3&gt;
&lt;p&gt;Success/False以外の例をいくつか。&lt;/p&gt;
&lt;pre class="c" xml:space="preserve" name="sourceCode"&gt;
enum OpenClose : bool { Open, Close };
OpenClose CheckOpenClose();
OpenClose OpenTray();

enum YesNo : bool { Yes, No };
YesNo CheckResponse();
YesNo WaitResponse();

enum GoodBad : bool { Good, Bad };
GoodBad CheckFile(const char * file_name);

enum MaleFemale : bool { Male, Female };
MaleFemale CheckSexuality();
&lt;/pre&gt;
&lt;p&gt;などなど&lt;/p&gt;
&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/179566.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>T.Hirase</dc:creator><title>[C#] SplitContainer/SplitterPanel 使いにくい！</title><link>http://blogs.wankuma.com/hirase/archive/2008/07/02/146647.aspx</link><pubDate>Wed, 02 Jul 2008 01:20:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2008/07/02/146647.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/146647.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2008/07/02/146647.aspx#Feedback</comments><slash:comments>70</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/146647.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/146647.aspx</trackback:ping><description>&lt;p&gt;つぶやき、ですが・・・&lt;/p&gt;
&lt;p&gt;.NET Framework 2.0 から追加されました SplitContainer/SplitterPanel が異常に使いにくい。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SplitContainer.Panel1Collapsed / Panel2Collapsed プロパティでパネルの開閉するって、どうかしてるよ。&lt;/li&gt;
&lt;li&gt;SplitterPanel が sealed クラスなのは、どうかしてるよ。&lt;/li&gt;
&lt;li&gt;SplitterContainer.Panel1 / Panel2 からしか各パネルにアクセスできないって、どうかしてるよ。&lt;/li&gt;
&lt;li&gt;SplitContainer の両方のパネルを閉じられないって、どうかしてるよ。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;順を追ってみていきます。&lt;/p&gt;
&lt;h4&gt;SplitContainer.Panel1Collapsed / Panel2Collapsed プロパティでパネルの開閉するって、どうかしてるよ。&lt;/h4&gt;
&lt;p&gt;「メソッドでヤラせろよ。」とか、「SplitterPanel.Collapsed プロパティ（internal）を使わせろ。」とか、そういう話。というか、どうして、「Panels」がないんだ！　信じられない！&lt;/p&gt;
&lt;h4&gt;SplitterPanel が sealed クラスなのは、どうかしてるよ。&lt;/h4&gt;
&lt;p&gt;あぁ、もう最悪。継承できない。（SplitContainer を継承して、無駄なものを作ることは可能）&lt;/p&gt;
&lt;h4&gt;SplitterContainer.Panel1 / Panel2 からしか各パネルにアクセスできないって、どうかしてるよ。&lt;/h4&gt;
&lt;p&gt;我求ム「Panels」。ま、内部的には「Controls」に「Panel1」と「Panel2」が入っているのは知っているけど、いちいちキャストせにゃならんじゃん。いうか、パネル２つしかないのってもったいないよ！&lt;/p&gt;
&lt;h4&gt;SplitContainer の両方のパネルを閉じられないって、どうかしてるよ。&lt;/h4&gt;
&lt;p&gt;これ、ちょっと特殊だけど、両方のパネルを閉じたときには、その SplitContainer の親要素が SplitterPanel であれば、その SplitterPanel を閉じて欲しいのよね（そうじゃないときは、例外発生か、閉じられないか）。&lt;/p&gt;
&lt;p&gt;以上&lt;/p&gt;
&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/146647.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>T.Hirase</dc:creator><title>[C++/CLI] RootNamespaceが狂っていると、System.Resources.MissingManifestResourceExceptionが発生します。</title><link>http://blogs.wankuma.com/hirase/archive/2008/06/10/142642.aspx</link><pubDate>Tue, 10 Jun 2008 15:07:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2008/06/10/142642.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/142642.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2008/06/10/142642.aspx#Feedback</comments><slash:comments>37</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/142642.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/142642.aspx</trackback:ping><description>&lt;p&gt;C++/CLIアプリを作成して、ローカライズ（L10N or I18N) します。このとき、もし自分で名前空間を変えているなら、実行時に「System.Resources.MissingManifestResourceException」例外が発生します。&lt;/p&gt;
&lt;h3&gt;詳細&lt;/h3&gt;
&lt;p&gt;どうもアセンブリリソースを埋め込む際に、ルート名前空間を見て名前を修飾して埋めているらしく、ローカライズしたフォーム（ApplyResourceを呼びだしている）クラスの名前空間がルート名前空間とずれていると、実行時に適切なリソースを見つけられなくて、「System.Resources.MissingManifestResourceException」例外が発生するようです。&lt;/p&gt;
&lt;p&gt;対処方法は2つ。（ま、結局2つともに同じことなんですけど）&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;フォームクラスの名前空間を、ルート名前空間に合わせる。&lt;/li&gt;
&lt;li&gt;ルート名前空間を、フォームクラスの名前空間に合わせる。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ルート名前空間は、プロジェクトのプロパティウィンドウ（プロパティページでもプロパティマネージャでもないですよ！）の、ルート名前空間で変更するか、プロジェクトをいったんソリューションエクスプローラからアンロードして、右クリックで編集するなどします。&lt;/p&gt;
&lt;p&gt;あぁ、つらい。&lt;/p&gt;
&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/142642.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>T.Hirase</dc:creator><title>[C++/CLI] アンマネージのコールバックにマネージのメソッドを登録する。</title><link>http://blogs.wankuma.com/hirase/archive/2008/06/09/142430.aspx</link><pubDate>Mon, 09 Jun 2008 21:34:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2008/06/09/142430.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/142430.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2008/06/09/142430.aspx#Feedback</comments><slash:comments>1050</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/142430.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/142430.aspx</trackback:ping><description>&lt;p&gt;こんな方法は・・・・・・・&lt;/p&gt;
&lt;pre class="cpp" xml:space="preserve" name="sourceCode"&gt;using namespace System;

#pragma unmanaged
// コールバック関数の型
typedef int (__stdcall *CallbackFuncType)(int, float);

// コールバック関数
static CallbackFuncType g_func;

// コールバック関数の登録
void SetCallback(CallbackFuncType f)
{
    g_func = f;
}

// コールバック関数の呼び出し。
int Run()
{
    return g_func(10, 0.5f);
}
#pragma managed

int __stdcall MyFunc(int i, float f)
{
    Console::WriteLine(i.ToString());
    return static_cast&amp;lt;int&amp;gt;(i * f);
}

int main(array&amp;lt;System::String ^&amp;gt; ^args)
{
    // Callback登録（マネージ関数を登録・・）
    SetCallback(MyFunc);

    // GCしても大丈夫かを確認（登録した関数ポインタがGCされる・・ない）
    GC::Collect(2, GCCollectionMode::Forced);

    // コールバックをネイティブ関数に呼び出してもらう（GCされてたら死亡）
    Int32 ret = Run();
    Console::WriteLine(ret.ToString());

    return 0;
}
&lt;/pre&gt;
&lt;p&gt;これって、どうなんだろう。実行は問題ないんだけど。。&lt;/p&gt;
&lt;p&gt;MSDN「&lt;a href="http://msdn.microsoft.com/library/367eeye0.aspx"&gt;方法 : C++ Interop を使用してコールバックおよびデリゲートをマーシャリングする&lt;/a&gt;」とは違う方法で、&lt;a href="http://msdn.microsoft.com/library/system.runtime.interopservices.marshal.getfunctionpointerfordelegate.aspx"&gt;Marshal::GetFunctionPointerForDelegate()&lt;/a&gt; も使わないんだけど・・・。&lt;/p&gt;
&lt;p&gt;何かご存じの方、、ヘルプミー。&lt;/p&gt;
&lt;h3&gt;See Also&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=36275&amp;forum=7"&gt;[C#] デリゲートをGCの対象から外す方法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/ja-JP/library/367eeye0.aspx"&gt;方法 : C++ Interop を使用してコールバックおよびデリゲートをマーシャリングする&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/367eeye0.aspx"&gt;How to: Marshal Callbacks and Delegates Using C++ Interop&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/142430.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>