私はC ++で列挙型を持っています
enum color {
BLACK,GREEN,RED
};
Javaでは、文字列値を使用して文字列値を受け取ることができcolor.BLACK.name()
ます..
c++ は同じ動作をしますか、または enum を char* に変換するにはどうすればよいですか?
短い答えはありません。ただし、効果を模倣するために実行できる「慣用的な」マクロトリックがいくつかあります。
この理由は、C ++では「必要なものだけを支払う」傾向があるためです(これにより、慎重に設計すれば、はるかにパフォーマンスの高いコードを記述できます)。
コードプロジェクトにはこれに関する記事があり、グーグルは他の多くの記事を表示します。
少し前に、列挙型を QComboBox に適切に表示し、列挙型と文字列表現を 1 つのステートメントとして定義するためのトリックを作成しました。
#pragma once
#include <boost/unordered_map.hpp>
namespace enumeration
{
struct enumerator_base : boost::noncopyable
{
typedef
boost::unordered_map<int, std::wstring>
kv_storage_t;
typedef
kv_storage_t::value_type
kv_type;
kv_storage_t const & kv() const
{
return storage_;
}
LPCWSTR name(int i) const
{
kv_storage_t::const_iterator it = storage_.find(i);
if(it != storage_.end())
return it->second.c_str();
return L"empty";
}
protected:
kv_storage_t storage_;
};
template<class T>
struct enumerator;
template<class D>
struct enum_singleton : enumerator_base
{
static enumerator_base const & instance()
{
static D inst;
return inst;
}
};
}
#define QENUM_ENTRY(K, V, N) K, N storage_.insert(std::make_pair((int)K, V));
#define QBEGIN_ENUM(NAME, C) \
enum NAME \
{ \
C \
} \
}; \
} \
#define QEND_ENUM(NAME) \
}; \
namespace enumeration \
{ \
template<> \
struct enumerator<NAME>\
: enum_singleton< enumerator<NAME> >\
{ \
enumerator() \
{
//usage
/*
QBEGIN_ENUM(test_t,
QENUM_ENTRY(test_entry_1, L"number uno",
QENUM_ENTRY(test_entry_2, L"number dos",
QENUM_ENTRY(test_entry_3, L"number tres",
QEND_ENUM(test_t)))))
*/
これenumeration::enum_singleton<your_enum>::instance()
で、列挙型を文字列に変換できるようになりました。に置き換えるkv_storage_t
とboost::bimap
、逆変換もできるようになります。Qtオブジェクトをテンプレートにすることができなかったため、コンバーターの共通基本クラスが導入され、Qtオブジェクトに保存されました
この言語では、これに対する直接的なサポートはありません。実際、一般的なケースでは、不可能ではないにしても難しいでしょう: enum
C++ では、列挙型との関係は限られており、次のように書くことができます:
enum E
{
a = 0,
b = 0,
c = 0
};
、同じ値を持ついくつかの列挙定数があります。
(enum ステートメントを解析し、文字列との間のマッピング コードを生成するコードを作成しました。上記のような enum を指定すると、 に設定されているかどうかに関係なく、0 の enum 値が にマップさ"a"
れます。非常に便利ですが、これが正しい解決策だと思います: マッピングが必要または要求された場合にマッピングを生成する外部プログラムです。)a
b
c