EnumValueクラスの使い方について – プログラミング – Home

EnumValueクラスの使い方につい...
 
通知
すべてクリア

[解決済] EnumValueクラスの使い方について

固定ページ 1 / 2

鍋奉行
 鍋奉行
(@鍋奉行)
ゲスト
結合: 17年前
投稿: 15
Topic starter  

今日は、宜しくお願いします。
EnumValueというクラスがありますがサンプルになるコードも少なくどの様に使うものな
のかも分かりません。
MSDNを読みますと、「パラメータがEnum型である場合パラメータの値を保持します。」
との記述がありのですが、この意味はEnum型のデータに例えば文字列であっても、
定義して使うことが出来るということなのでしょうか?

私の想像では下記のような振舞いが、構造体のメンバー変数に指定できるようなイメージ
なのですが?

もし私のEnumValueクラスの認識が、間違っていましたら、使い方と簡単なコードをご教
示して頂ければ幸いです。

#include <stdio.h>

enum EN_COLOR{ RED, BLUE, YELLOW, MAX_COLOR };

int main(void)
{
char *message[MAX_COLOR] = {赤, 青, 黄};
enum EN_COLOR color;
int num;

puts( 番号を入力して下さい );
scanf( %d, &num );

puts( message[num] );

return 0;
}

環境:Windows XP Visual Studio 2005 MFC


引用未解決
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

これ、名前空間 SqlServer に属してますよ。
データベース上のデータ型としてのEnumちゃいますか?


返信引用
鍋奉行
 鍋奉行
(@鍋奉行)
ゲスト
結合: 17年前
投稿: 15
Topic starter  

επιστημηさんお世話になります。
名前空間SqlServerですか、それでコードも少ないしC++の本にもSTL本にも載っていない
訳か・・・・・
以前から、上記のコードのようなやり方より、スマートに集合型の変数を文字列に
変換したり、逆に文字列を集合型の変数に変換出来ないものかと思っていたて、
てっきりEnumValueというクラスがそれかと思ったんですが、どうやら私の勘違いのよう
でした。
因みにεπιστημηさんでしたら、このような場合、どの様な実装を考えられますでしょう
か?
std::string型のstd::vectorを生成して、要素を代入したり、取り出したりするようなイ
メージになるのかな?


返信引用
鍋奉行
 鍋奉行
(@鍋奉行)
ゲスト
結合: 17年前
投稿: 15
Topic starter  

失礼しましたεπιστημηさんだけでなく、皆さんならどの様に考えられますでしょうか。
いいアイデアがあればご教示願います。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

んー僕ならおそらくは vector< pair<EN_COLOR,string> > でしょうねぇ。


返信引用
鍋奉行
 鍋奉行
(@鍋奉行)
ゲスト
結合: 17年前
投稿: 15
Topic starter  

ありがとうございます。
enum型の値と、std::string型のデータをpairで関連付けする方法ですね
なるほど、そうすれば列挙型のデータ構造もそのまま使えるし
いいかもしれないです。
std::pairは簡単std::mapコンテナでしか使ったことが無いので自信がありませんが
こんな感じで宜しいでしょうか?

#include <stdio.h>
#include <vector>
#include <utility>
using namespace std;

const enum EN_COLOR{ RED, BLUE, YELLOW };
typedef std::pair<EN_COLOR, string> en_str_pair;

int main(void)
{
std::vector< en_str_pair > v;
v.push_back(en_str_pair(RED, 赤));
v.push_back(en_str_pair(BLUE, 青));
v.push_back(en_str_pair(YELLOW, 黄));

return 0;
}

googleでstd::pairを検索したら
επιστημηさんがレスを付けられた、
『std::pairの入ったvectorのソートと重複削除』というここの掲示板のレスが
最初にヒットしたので、参考にさせて書いてみました。


返信引用
焼肉奉行
 焼肉奉行
(@焼肉奉行)
ゲスト
結合: 17年前
投稿: 5
 

CLRコンソールアプリ

----------------------------------------------------------------------
// test.cpp : メイン プロジェクト ファイルです。

#include stdafx.h

using namespace System;
using namespace System::Diagnostics;

ref class EnumName : System::Attribute
{
public:
System::String^ name_;

EnumName(System::String^ name){
name_ = name;
}

static System::String^ GetName(System::Type^ type, System::Object^
value){
System::String^ strName = System::Enum::GetName(type, value);
System::Reflection::FieldInfo^ Info = type->GetField
(strName);
EnumName^ target = (EnumName^)Attribute::GetCustomAttribute
(Info, EnumName::typeid);
return target->name_;
}
};

enum class Color{
[EnumName(赤)]
Red,
[EnumName(青)]
Blue
};

enum class Fruit{
[EnumName(りんご)]
Apple,
[EnumName(みかん)]
Orange
};

int main(array<System::String ^> ^args)
{
Console::WriteLine(EnumName::GetName(Color::typeid, Color::Red));
Console::WriteLine(EnumName::GetName(Color::typeid, Color::Blue));
Console::WriteLine(EnumName::GetName(Fruit::typeid, Fruit::Apple));
Console::WriteLine(EnumName::GetName(Fruit::typeid, Fruit::Orange));
return 0;
}


返信引用
鍋奉行
 鍋奉行
(@鍋奉行)
ゲスト
結合: 17年前
投稿: 15
Topic starter  

またまた失礼します、
×参考にさせて書いてみました。
○参考にさせて頂きました。
です、それから
const enum EN_COLOR{ RED, BLUE, YELLOW };
のconstはいらないですね、最近Effective C++の第3版を読み始めて、何でもかんでも
constを付けてしまう、悪い癖が身についてしまって困っていますww
単純に私の理解力、読解力が足らないだけですが。


返信引用
焼肉奉行
 焼肉奉行
(@焼肉奉行)
ゲスト
結合: 17年前
投稿: 5
 

よくよく考えたら最初の引数いらない。

// test.cpp : メイン プロジェクト ファイルです。

#include stdafx.h

using namespace System;

ref class EnumName : System::Attribute
{
public:
System::String^ name_;

EnumName(System::String^ name){
name_ = name;
}

static System::String^ GetName(System::Object^ value){
System::String^ strName = System::Enum::GetName(value-
>GetType(), value);
System::Reflection::FieldInfo^ Info = value->GetType()-
>GetField(strName);
EnumName^ target = (EnumName^)Attribute::GetCustomAttribute
(Info, EnumName::typeid);
return target->name_;
}
};

enum class Color{
[EnumName(赤)]
Red,
[EnumName(青)]
Blue
};

enum class Fruit{
[EnumName(りんご)]
Apple,
[EnumName(みかん)]
Orange
};

int main(array<System::String ^> ^args)
{
Console::WriteLine(EnumName::GetName(Color::Red));
Console::WriteLine(EnumName::GetName(Color::Blue));
Console::WriteLine(EnumName::GetName(Fruit::Apple));
Console::WriteLine(EnumName::GetName(Fruit::Orange));
return 0;
}


返信引用
鍋奉行
 鍋奉行
(@鍋奉行)
ゲスト
結合: 17年前
投稿: 15
Topic starter  

焼肉奉行さんお世話になります。
私のイメージしてやりたかったことは多分、焼肉奉行さんのコードだと思います。
しかし、今の私にはハードルが高すぎます、C++で実装しても、限りなくCに
近いコードしか、書けない程度で、最近STLを真剣に取得しようと思い、
επιστημηさんが監修された『STL標準講座』を読み、簡単なSTLの実装が出来るようにな
ったので、更に関数オブジェクトを深く知りたいと思い
スコットメイヤーズ氏の『Effective STL』を読み始めたらC++の力量が足らないと思い知

『Effective C++第3版』を読んでいるのですが、難解すぎてもがいています。
そんな私にCLRなんて、とてもではないと思うのですが・・・・・
しかし凄いし誘惑されそうです、でも多分無理です。


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

焼肉奉行さんのコードはそもそもC++ではないので(似てるけど別言語:C++/CLI)、
違いを知らないと理解に困るのは、ハードルの問題ではないような…。

# > Windows XP Visual Studio 2005 MFC
# ↑この環境だと、C++以外にC++/CLIも使えます。

C++は、ISO/IEC:14882。国際標準化機構で標準化。STLとかはこっちです。

C++/CLIは、ECMA-372。Microsoft社提案で、現実的には.NET framework用。
エクマインターナショナル(旧:欧州電子計算機工業会)で標準化。


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

・C
・C++
・C++/CLI
・Objective-C
・D
・C#
・Java
・…

世に登場した順番があるだけで、互いに違う言語です。
仮に、前のものを改良/進化した、と主張している人がいたとしても、
前のものを駆逐したわけでも、同じ言語がバージョンアップしたわけでもないので、
順番に追わないといけないものでもありません。

特に、C++/CLIは、Managed C++ (Microsoft社がC++を.NET F/W用に独自拡張)を
ベースにしてますし、Windowsで.NET関係じゃないと今のところあまり使えません。

Managed C++という独自拡張をやってみたものの、不評で総スカンだったので、
C++に似せて作り直した.NET用言語といった方が近い感じですし….NETなら
C#の方が良い可能性も…。
# 個人的には、C++/CLIも言語としては嫌いではありませんが。


返信引用
焼肉奉行
 焼肉奉行
(@焼肉奉行)
ゲスト
結合: 17年前
投稿: 5
 

失礼しました。
EnumValueを聞かれてたのでテッキリ。

要はenumの宣言とそれに対応する値が離れてしまうのが嫌って事ですよね。
でも、それはどうしようも無いのではないでしょうか。

やるとすればenumに似せたクラスを作成するか、επιστημηさんが書かれている
ようにvector< pair<EN_COLOR,string> >にするかではないでしょうか?
自分だったらstd::map<EN_COLOR,std::string>にするかな。


返信引用
焼肉奉行
 焼肉奉行
(@焼肉奉行)
ゲスト
結合: 17年前
投稿: 5
 

こんなの作ってみた。
win32コンソール

-----------------------------------------------------------------------------
// testCon.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include stdafx.h
#include <string>
#include <iostream>

class CColorEnum{
static std::wstring name[];

public:
enum Color{
RED,
BLUE,
};

static std::wstring GetName(CColorEnum::Color col)
{
return name[col];
}

std::wstring operator[](CColorEnum::Color col)
{
return name[col];
}
};

std::wstring CColorEnum::name[] =
{
L赤,
L青,
};

int _tmain(int argc, _TCHAR* argv[])
{
CColorEnum col;
std::wcout.imbue(std::locale(japanese));
std::wcout << CColorEnum::GetName(CColorEnum::RED) <<std::endl;
std::wcout << CColorEnum::GetName(CColorEnum::BLUE) <<std::endl;
std::wcout << col[col.RED] <<std::endl;
std::wcout << col[col.BLUE] <<std::endl;
return 0;
}


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> 自分だったらstd::map<EN_COLOR,std::string>にするかな。

いや、文字列からenumへの変換もやりたいってことでしたので。
enumで表現できる程度の要素数であればmap使うほどのこともなかろ、とも思いますし。


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました