2015年1月30日金曜日

C++ の enum class にも C# の enum の ToString のような機能が欲しい

欲しい(´・ω:;.:…
似たような欲しい人も居るような気がするので、 boost/preprocessor のぱわーを借りて用意したCPPライブラリーを公開しておいてみる。MIT Licenseという事にしてgistに置いておくのでごじゆうにどうぞ。
https://gist.github.com/usagi/0093be0daffd796afef4
/// @file enum.hxx

#pragma once

#include <string>
#include <stdexcept>

#include <boost/preprocessor.hpp>

// WRP_MAKE_ENUM の内部で switch-case の case を生成するための補助マクロ
#define WRP_MAKE_ENUM_TO_STRING_ELEMENT( r, data, elem ) \
  case data :: elem : return BOOST_PP_STRINGIZE( elem ); \

// enum class _symbol_name : _base_type { enumerators }; と to_string( const _symbol_name ) を生成するためのマクロ
#define WRP_MAKE_ENUM( _symbol_name, _base_type, enumerators ) \
enum class _symbol_name \
  : _base_type \
{ BOOST_PP_SEQ_ENUM( enumerators ) \
}; \
 \
template < typename T = void > \
inline auto to_string( const _symbol_name value ) \
  -> std::string \
{ \
  switch ( value ) \
  { \
    BOOST_PP_SEQ_FOR_EACH( \
      WRP_MAKE_ENUM_TO_STRING_ELEMENT, \
      _symbol_name, \
      enumerators \
    ) \
    default: throw std::runtime_error( "undefined enum member" );\
  } \
} \
つかいかた:
#include <iostream>
#include <cstdint>

#include "enum.hxx"

namespace abc
{
  WRP_MAKE_ENUM
  ( def
  , std::uint8_t
  , ( ppp )
    ( qqq )
    ( rrr )
  )
}

auto main()
  -> int
{
  std::cout
   << to_string( abc::def::ppp ) << "\n"
   << to_string( abc::def::qqq ) << "\n"
   << to_string( abc::def::rrr ) << "\n"
   ;
}
このサンプルの実行結果:
ppp
qqq
rrr

0 件のコメント:

コメントを投稿