VC++のswitch文の条件式にCString型は使えますか?


初心者服部  2005-10-16 10:56:53  No: 59276  IP: 192.*.*.*

質問です。初歩的な質問でお恥ずかしいのですが、

VisualC++.NETの使用で、関数中にて
switch文にて条件分岐をしたいのですが、
判定に使うのはCString方の変数の中に入った文字列で行いたいのですが
そのままコードを書くと、switch文は整数式でしか使えないというエラーが
出ます。
CString型の変数で使えないとかなり不便なのでは、と思うのですが、
使えないのでしょうか?使い方などあればご教授いただければ幸いです

編集 削除
DD,  2005-10-16 12:36:48  No: 59277  IP: 192.*.*.*

if〜else if〜elseでの代用ではダメなのでしょうか?

編集 削除
初心者服部  2005-10-16 14:44:12  No: 59278  IP: 192.*.*.*

お返事ありがとうございます。

現状 if文で希望する機能自体は実現出来ているんですが、
ただif文で今のままだと関数の機能の関係でif文自体が40以上並ぶ形になって
しまうのです。
実質的には問題ないというか同じなんだろうとは思うのですが、
やはりコードの見やすさの観点で、かなり見苦しいような気がしたもので
他に良い書き方は無いだろうかと思ったのです

編集 削除
Blue  2005-10-16 16:17:55  No: 59279  IP: 192.*.*.*

文字列テーブルまたはマップリストを使って、
リストから検索しインデックスを取得して、switch文で分岐という方法があります。

例えば、

int GetWordIndex( const CString strWord )
{
    static const LPCTSTR WORDTABLE[] = { "東京", "中山", "阪神", "京都" };
    static const int nSize = sizeof( WORDTABLE ) / sizeof( LPCTSTR );

    /* ここで文字列テーブルから検索しそのインデックスを取得 */ 
    /* ここでは逐次検索 */
    for ( int i = 0; i < nSize; ++i )
    {
        if ( strWord == WORDTABLE[ i ] )
        {
            return i;
        }
    }
    return -1;
}

//////// 主処理 ///////
switch ( GetWordIndex( strWord ) )
{
case 0: /* 東京 */
     /* 処理 */
     break;
case 1: /* 中山 */
     /* 処理 */
     break;
case 2: /* 阪神 */
     /* 処理 */
     break;
case 3: /* 京都 */
     /* 処理 */
     break;
default: /* その他 */
     /* 処理 */
     break;
}

みたいにする。
40もある場合は、マップリストにして検索するといいと思います。
(MFCのCMapをつかいLookupメソッドを利用するのかな)

編集 削除
シャノン  2005-10-16 17:20:43  No: 59280  IP: 192.*.*.*

ATOM を使うという手もあるかも。
やっていることはマップと同じですがね。

編集 削除
シャノン  2005-10-16 17:23:03  No: 59281  IP: 192.*.*.*

あー、ダメかもしんない。
case 文には定数値しか書けないんですもんね。
AddAtom の戻り値は実行時までわかんないだろうから。

編集 削除
Ban  2005-10-16 19:53:38  No: 59282  IP: 192.*.*.*

いっそ、CSring をキーにしたファンクタを std::map に登録してしまうとか。
# Microsoft のコレクションでもいいんでしょうけど。


# 条件毎にクラスを作ってポリモフィックにアクセスすれば、
# ファクトリ内部以外の switch 文は撲滅できるとか言う、
# 「継承原理主義者の主張」が昔あったような.......。

編集 削除
Ban  2005-10-16 21:55:30  No: 59283  IP: 192.*.*.*

> 40もある場合は、マップリストにして検索するといいと思います。
> (MFCのCMapをつかいLookupメソッドを利用するのかな)

既出、見落としてました...orz

編集 削除
PATIO  2005-10-17 11:00:59  No: 59284  IP: 192.*.*.*

VC++というのは開発環境の種類であって言語の種類ではないので
C++言語で使えるかというのが質問としては正しいような気がします。
普通は開発環境側で言語仕様を変えてしまうような事はないと思いますので。
で、言語レベルの話であれば、言語の入門書に載っていると思うので
入門書の方を確認してみたほうがいいかなと思います。
たいていの場合、「基本的な質問」とか「基本的な内容」という質問のされ方を
している場合は、開発環境に関する質問というより、言語レベルの質問が多いと
思います。
そういう意味では言語の入門書を当たって見られた方がいいです。
開発環境の入門書ではこの辺りの内容は書かれていないと思いますから。
言語的な基礎知識がないとVC++特有の部分(MFCを使ったウインドウ制御等)も
多分理解できないと思うので。

実装としては、Blueさんのが良さそうな気がします。
こういう解決するためのパターンを覚えておくと他の問題解決にも役に立つと
思いますよ。

編集 削除