1

一部の値が列挙型で定義されているかどうか、または C++ での実行時にチェックする必要があります。この要件は、C# で簡単に実現できます (次のコードを参照してください)。しかし、C++ には実行時に型情報がありません (私の知る限り)。回避策はありますか?

PS: 私のプロジェクトでは、enum 型は数百の値を定義するため、ソース コードで値を複製したくありません (たとえば、マップを作成し、すべての有効な値をそれにプッシュします)。保守性。

enum BoFormObjectEnum
{
    fo_Items = 4,
    fo_SalesEmployee = 53,
    fo_TransactionTemplates = 55,
    fo_JournalPosting = 30,
    fo_CheckForPayment = 57,
    fo_PaymentTermsTypes = 40,
    ...
}

class Program
{
    static void Main(string[] args)
    {
        var array = Enumerable.Range(1, 60);
        foreach (var item in array)
        {
            if (Enum.IsDefined(typeof(BoFormObjectEnum), item))
                // do some logic
            else
                // do some other logic
        }
    }
}
4

3 に答える 3

0

回避策はありますが、boost::fusionの形式で提供されるため冗長です。このライブラリの名前は、コンパイル時の純粋なテンプレート メタプログラミング ライブラリboost::mplと実行時の標準テンプレート ライブラリのハイブリッドであるという目的に由来しています。

boost::fusion を使用すると、ベクターまたはマップをコンパイル時に初期化して利用でき、実行時にも使用できます。

于 2012-11-13T07:31:26.817 に答える
0

C++ はあなたが望むものを提供しません。

最も「適切な」解決策は、全体を再設計し、このような C++ 列挙型を使用しないことです。これは C# の enum と同じではありません。union と enum が同じものであると考える以上に、それらは同じものと考えるべきではないほど十分に異なっています。C# ソリューションのことを忘れて、C++ ソリューションを設計します。

最も簡単なのは、特に列挙型の値が頻繁に変更されない場合 (そして、変更される場合、なぜそれらはハードコードされた列挙型なのか?)、単に「弾丸をかむ」だけで、有効な値を持つセットまたはマップを作成することです。いくつかの数値が列挙型として定義されているかどうかを知るには、それがセット内にあるかどうかをテストするか、名前も必要な場合はマップを使用して、int としての値と文字列としての名前の両方を含めることができます。

于 2012-11-13T08:03:08.300 に答える
0

あなたが探しているのはリフレクションと呼ばれ、C++ はこの機能を提供しませんが、これに関する記事がいくつかあります。

また、新しい C++11 標準では、列挙型に関する新しい機能が導入され、値を持つ単なる確率変数ではなく、型の安全性が大幅に向上しています。

于 2012-11-13T06:51:39.567 に答える