概要
表題の通りです。
enum(enum class)の名前を取得できる関数を作りました。C#のenumのToString()とかみたいな感じです。
enumかenum class以外を渡すとコンパイルエラーになるようになってる(してる)のでご注意を。
#include<iostream> #include"nameof_enum.h" enum Hoge { Huga, Piyo, }; int main(){ using namespace nameof_enum; Hoge hoge = Huga; std::cout << nameof(hoge) << std::endl; return 0; }
という感じで使うと
Huga
と表示されます。
include
nameof_enum.h
をincludeしてください
namespace
nameof_enum
関数
template<typename EnumType> std::string nameof(EnumType value, bool omitsNamespace = true); template<typename EnumType, int32_t MIN, int32_t MAX> std::string nameof(EnumType value, bool omitsNamespace = true);
基本的に
nameof(hoge) // hogeの値の名前を取得
と使います。 デフォルトだとenumが[-256,256]の範囲のものしか拾えないので、それを超える場合やそれほど広い範囲を拾う必要がない場合は
nameof<Hoge,-256,1000>(hoge) // [-256,1000]で収まるenumなら正常に動作する
と使ってください。
参考
殆どまんまですが、 qiita.com こちらの記事を参考にしました。
プロジェクト的にライブラリ導入はキツイ…という人は以下にコードを貼るので使えばいいと思います。*1
テンプレートで回す部分が書かれてなかったのでそこは足しました。
注意
内部で事前定義済みマクロを使用しているので、処理系依存です。
取り合えずVS2017で動作確認をとりました。
上手く動かない場合はnameof_enum_impl.h
のget_signature
の事前定義済みマクロをお使いの処理系で定義されているものに変え、extract_nameof
の処理をそのマクロで返されるシグネチャに適したものに変えれば動くと思います。
ソースコード
うざいくらいにコメントつけておいたので最悪読めばわかると思います。