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も見ています
-
「環境が人を育てる」って本当?環境によって人格や生き方は本当に変わるのか
環境が人生に与える影響は実際どれほどのものなのか、専門家の田宮由美さんに伺った。
-
列挙子(enumlator)の内容を文字列化するにはどうすればよいので
C言語・C++・C#
-
#defineの定数を文字列として読み込む
C言語・C++・C#
-
char*を初期化したいのですが
C言語・C++・C#
-
-
4
C言語 exitの使い方
C言語・C++・C#
-
5
newしないオブジェクトについて
C言語・C++・C#
-
6
C++で入力した文字列から数字を取り除くもしくは数字のみをのこす
C言語・C++・C#
-
7
c言語のenum
C言語・C++・C#
-
8
int型の内容をbyteの配列にコピー
Java
-
9
typedef enumの使い方を教えてください
C言語・C++・C#
-
10
C言語で、メモリを解放しないで終わるプログラム
C言語・C++・C#
-
11
型変換
C言語・C++・C#
-
12
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
13
C++のfor文について
C言語・C++・C#
-
14
define で 配列
C言語・C++・C#
-
15
C++でCの構造体をnewするとまずいのでしょうか?
C言語・C++・C#
-
16
C言語 配列の長さの上限
C言語・C++・C#
-
17
複数の変数を宣言する時、同時に初期化?できないでしょうか?
Java
-
18
C++ 構造体の一括初期化 {0}
C言語・C++・C#
-
19
【C++】関数ポインタの使い方
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
enumの値から定義名を文字列化...
-
switch文のエラーについて
-
VC++で文字列から任意の文字を...
-
C言語のポインターで詰まっている
-
CStringとString
-
C++での <iostream.h>と<iostre...
-
MingwでC++のソースがコンパイ...
-
std::wstringのメモリリークに...
-
Cの関数からC++の関数(DLL)を...
-
2重の(?)の#include
-
_CRT_SECURE_NO_DEPRECATE が効...
-
string型の固定長文字列を配列...
-
構造体に決められた文字列を入...
-
Cでのパケットキャプチャについて
-
ofstream::getがおかしい!
-
STL string::findで見つからな...
-
指定した文字を削除したい
-
getlineについて
-
6行ソースをコンパイル可能にし...
-
VHDLのsignedとunsignedの違いは?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
switch文のエラーについて
-
構文エラーが出ているのですが...
-
VC++で文字列から任意の文字を...
-
enumの値から定義名を文字列化...
-
空ENTERの判別
-
C++でShowCursorを使いたい。
-
なぜ、C++の標準ヘッダをインク...
-
#define中の#のエスケープ
-
C++で、テキストファイルを一行...
-
gccでコンパイル時のエラー
-
C言語のエラーを修正したい
-
#include "fstream.h"
-
C言語のポインターで詰まっている
-
リモートデスクトップの接続元I...
-
構造体配列のvectorへの変換と...
-
JPEGやPNGが読めるLoadImage関数
-
VS2019でofstreamが未定義になる
-
構造体に決められた文字列を入...
-
VHDLのsignedとunsignedの違いは?
-
std::wstringのメモリリークに...
おすすめ情報