

C++でenumの値を元に、定義した名前(Fruits_Appleとか)を文字列として取得したいのですが、何か良い方法はないでしょうか?
switch文等で分岐させて...という方法もありますが、enumの定義数が多くなるとコードが複雑になるので、シンプルな方法をさがしています。
enum Fruits{
Fruits_Apple,
Fruits_Orange,
Fruits_End
};
void printFruits(Fruits fruits)
{
// ここで引数fruitsの値に応じて"Fruits_Apple"とか"Fruits_Orange"とかを
// 文字列に代入したい
std::string fruitsName = "Fruits_Apple";
}
No.4ベストアンサー
- 回答日時:
こんばんは。
例えば、boostライブラリのメタプリプロセッサの如く、可視性など関係なしに手段を選ばなければナンボでも出来ます。
ただし一回でも陥ると地獄そのものです。
//-------------------------------------------------------------------------------------
//misc.hpp
//-------------------------------------------------------------------------------------
#ifndef __MISC_HPP__
#define __MISC_HPP__
#define ArrayCount(a) (sizeof(a)/sizeof(a[0]))
#define ArrayEnd(a) (a + ArrayCount(a))
#endif
//-------------------------------------------------------------------------------------
//misc.hpp
//-------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------
//fruits.hpp
//-------------------------------------------------------------------------------------
#include"misc.hpp"
//enumを作成する
#ifdef MAKEENUM
#define MAKEHDR(name) enum name {
#define MAKELINE(name) name
#define MAKEFTR(name) };
//arr##name##Pair[]を作成して、map##name##Resultに入れる
#else
#define MAKEHDR(name)std::pair<name, std::string> arr##name##Pair[] = {
#define MAKELINE(name)std::make_pair(name, std::string(#name))
#define MAKEFTR(name)}; \
std::map<name, std::string> map##name##Result;\
{for(size_t n = 0; n < ArrayCount(arr##name##Pair); ++n)map##name##Result.insert(arr##name##Pair[n]);}
#endif
MAKEHDR(Fruits)
MAKELINE(Fruits_Apple),
MAKELINE(Fruits_Orange),
MAKELINE(Fruits_End)
MAKEFTR(Fruits)
MAKEHDR(Gender)
MAKELINE(Gender_Male),
MAKELINE(Gender_Female),
MAKELINE(Gender_End)
MAKEFTR(Gender)
#undef MAKEHDR
#undef MAKELINE
#undef MAKEFTR
#undef MAKEENUM
//-------------------------------------------------------------------------------------
//fruits.hpp
//-------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------
//test.cpp
//-------------------------------------------------------------------------------------
#include<map>
#include<string>
#include<iostream>
//enumの作成
#define MAKEENUM
#include"fruits.hpp"
static void Print(Fruits fruits, Gender gender)
{
//map##name##Resultの作成
#include"fruits.hpp"
std::cout << mapFruitsResult[fruits] << std::endl;
std::cout << mapGenderResult[gender] << std::endl;
}
int main()
{
::Print(Fruits_Apple, Gender_Female);
return 0;
}
//-------------------------------------------------------------------------------------
//test.cpp
//-------------------------------------------------------------------------------------
No.3
- 回答日時:
enum は コンパイルの時点で解決されることが多いので
地道にやるしかないですね。
要は名前に変換できればいいんですよね。
C++ならstd::mapを準備してあげるのが無難なのかなー?
僕なら、静的な配列と取得関数を作るけど。。。(C99)
# 下はコンパイルしていないので文法ちょっと違うかも
----xxx.h
enum Fruits { Fruits_Apple, Fruits_Orange, NumberOfFruits };
extern const char * getNameByFruits( const Fruits n );
----xxx.c
const char * getNameByFruitsIX( const Fruits n )
{
static const char *FruitsName[NumberOfFruits] =
{
[Fruits_Apple] = "りんご",
[Fruits_Orange] = "みかん",
}
if( n < NumberOfFruits ) return FruitsName[n];
return "";
}
No.2
- 回答日時:
マクロを駆使しつつ, map で変換関数でも書くかな. 例えば
DeclareFruitMember(Apple)
DeclareFruitMember(Orange)
...
#undef DeclareFruitMember
と書かれたファイルを作って,
enum Fruits {
#define DeclareFruitMember(mem) Fruits_##mem,
#include "それ"
};
std::pair<enum Fruits, std::string> fruitMemberStrings[] = {
#define DeclareFruitMember(mem) { Fruits_##mem, "Fruits_" #mem },
#include "それ"
};
std::map<enum Fruits, std::string> fruitMemberMap(fruitsMemberStrings, fruitsMemberStrings+要素数);
みたいに.
No.1
- 回答日時:
マクロ(define)からならこんなことはできますけど…
#define APPLE 0
#define TO_STR(str) #str
TO_STR(APPLE)
残念ながらenumからはないんじゃないですかね。(あれば知りたい)
# 無理矢理派生クラスで独自enum風クラスを作って、
# typeid().name()をつかって…とか考えると、
# 素直に変換関数を書いた方がよほどシンプルだと思いますし。
# もしくは、(独自)プリプロセッサをかませるか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript sessionStorageを調べています。 1 2023/06/20 12:41
- JavaScript セレクトを全て選択されていないと、文字によるエラーメッセージを表示させるコードを調べています 2 2023/06/22 15:48
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- その他(プログラミング・Web制作) 2つのテキストファイルを比べて文字列を特定する方法を教えて下さい 5 2022/05/01 15:22
- C言語・C++・C# C言語について質問です。 以下のような結果を出すためにはどのようなコードが良いですか?サンプルコード 3 2022/11/01 16:19
- Visual Basic(VBA) VBA 改行コードの取り方 1 2022/03/22 14:14
- Excel(エクセル) 【Excel】指定した文字列に該当する行を重複しないようにリスト 3 2022/03/30 12:27
- PostgreSQL 数値が定期的にあらわれる文字列から、いくつめに出現した数値が指定して切り出したい 1 2023/06/08 13:12
- Visual Basic(VBA) マクロについて教えてください。 4 2023/06/06 09:06
- Excel(エクセル) VBAで “:” を含むセルの特定 2 2023/05/11 16:30
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラミングについて。 1つ...
-
gccを行ってもexeファイルが生...
-
c言語
-
visual studio 2022でのC#プロ...
-
C# DatagridviewにExcelシート...
-
mallocについて
-
C言語って古いですか?
-
C言語関数違いについて。
-
逆コンパイルと逆アセンブルの...
-
プログラムの実行時に'<'でリダ...
-
パソコン
-
CPUが16bitでも32bitOSでコンパ...
-
Python、プログラミングについ...
-
だれがとけるの?
-
バッチファイルで以下のような...
-
Notepad++の関数リスト表示の変...
-
VisualStudio2022でC言語プログ...
-
License='MIT' ってなんでmitな...
-
C言語 ストリームについて。
-
c言語でイベントフラグを使った...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語
-
gccを行ってもexeファイルが生...
-
大量のデータを読み込んで表示...
-
visual studio 2022でのC#プロ...
-
C++でデスクトップGUIアプリ開...
-
【C言語】全角文字の配列を、全...
-
Windows Formアプリからコンソ...
-
VisualStudio2022でC言語プログ...
-
C#でログファイルにファイルパ...
-
C#でTreeViewのCheckBoxのサイ...
-
c#のTLS1.2での通信について
-
VisualStudioでC++クラスを追加...
-
C言語について。
-
int16_t の _t は何?
-
プログラマー達は何故、プログ...
-
逆コンパイルと逆アセンブルの...
-
C言語の関数のextern宣言
-
c言語でイベントフラグを使った...
-
C言語 関数、変数の宣言について
-
[C言語]fputsとfprintfの違い
おすすめ情報