稲枝の押入れ

いなえが適当なことを書いては、しまっておく場所

C++でenumの名前を取得する

概要

表題の通りです。

enum(enum class)の名前を取得できる関数を作りました。C#enumのToString()とかみたいな感じです。

enumenum 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.hget_signatureの事前定義済みマクロをお使いの処理系で定義されているものに変え、extract_nameofの処理をそのマクロで返されるシグネチャに適したものに変えれば動くと思います。

ソースコード

うざいくらいにコメントつけておいたので最悪読めばわかると思います。

*1:著作権を放棄したわけではないです