今日は、宜しくお願いします。
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
これ、名前空間 SqlServer に属してますよ。
データベース上のデータ型としてのEnumちゃいますか?
επιστημηさんお世話になります。
名前空間SqlServerですか、それでコードも少ないしC++の本にもSTL本にも載っていない
訳か・・・・・
以前から、上記のコードのようなやり方より、スマートに集合型の変数を文字列に
変換したり、逆に文字列を集合型の変数に変換出来ないものかと思っていたて、
てっきりEnumValueというクラスがそれかと思ったんですが、どうやら私の勘違いのよう
でした。
因みにεπιστημηさんでしたら、このような場合、どの様な実装を考えられますでしょう
か?
std::string型のstd::vectorを生成して、要素を代入したり、取り出したりするようなイ
メージになるのかな?
失礼しましたεπιστημηさんだけでなく、皆さんならどの様に考えられますでしょうか。
いいアイデアがあればご教示願います。
んー僕ならおそらくは vector< pair<EN_COLOR,string> > でしょうねぇ。
ありがとうございます。
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のソートと重複削除』というここの掲示板のレスが
最初にヒットしたので、参考にさせて書いてみました。
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;
}
またまた失礼します、
×参考にさせて書いてみました。
○参考にさせて頂きました。
です、それから
const enum EN_COLOR{ RED, BLUE, YELLOW };
のconstはいらないですね、最近Effective C++の第3版を読み始めて、何でもかんでも
constを付けてしまう、悪い癖が身についてしまって困っていますww
単純に私の理解力、読解力が足らないだけですが。
よくよく考えたら最初の引数いらない。
// 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;
}
焼肉奉行さんお世話になります。
私のイメージしてやりたかったことは多分、焼肉奉行さんのコードだと思います。
しかし、今の私にはハードルが高すぎます、C++で実装しても、限りなくCに
近いコードしか、書けない程度で、最近STLを真剣に取得しようと思い、
επιστημηさんが監修された『STL標準講座』を読み、簡単なSTLの実装が出来るようにな
ったので、更に関数オブジェクトを深く知りたいと思い
スコットメイヤーズ氏の『Effective STL』を読み始めたらC++の力量が足らないと思い知
り
『Effective C++第3版』を読んでいるのですが、難解すぎてもがいています。
そんな私にCLRなんて、とてもではないと思うのですが・・・・・
しかし凄いし誘惑されそうです、でも多分無理です。
焼肉奉行さんのコードはそもそもC++ではないので(似てるけど別言語:C++/CLI)、
違いを知らないと理解に困るのは、ハードルの問題ではないような…。
# > Windows XP Visual Studio 2005 MFC
# ↑この環境だと、C++以外にC++/CLIも使えます。
C++は、ISO/IEC:14882。国際標準化機構で標準化。STLとかはこっちです。
C++/CLIは、ECMA-372。Microsoft社提案で、現実的には.NET framework用。
エクマインターナショナル(旧:欧州電子計算機工業会)で標準化。
・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も言語としては嫌いではありませんが。
失礼しました。
EnumValueを聞かれてたのでテッキリ。
要はenumの宣言とそれに対応する値が離れてしまうのが嫌って事ですよね。
でも、それはどうしようも無いのではないでしょうか。
やるとすればenumに似せたクラスを作成するか、επιστημηさんが書かれている
ようにvector< pair<EN_COLOR,string> >にするかではないでしょうか?
自分だったらstd::map<EN_COLOR,std::string>にするかな。
こんなの作ってみた。
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;
}
> 自分だったらstd::map<EN_COLOR,std::string>にするかな。
いや、文字列からenumへの変換もやりたいってことでしたので。
enumで表現できる程度の要素数であればmap使うほどのこともなかろ、とも思いますし。