7

これが理論上どのように機能するのか興味深いです。例:

#include <boost/type_traits/is_enum.hpp>
#include <iostream>

enum foo 
{
    AAA,
    BBB
};

typedef foo bar;

struct sfoo {
    enum bar {
        CCC
    };
};

int main()
{
    std::cout << boost::is_enum<foo>::value << "\n";        // 1
    std::cout << boost::is_enum<bar>::value << "\n";        // 1
    std::cout << boost::is_enum<sfoo>::value << "\n";       // 0
    std::cout << boost::is_enum<int>::value << "\n";        // 0
    std::cout << boost::is_enum<sfoo::bar>::value << "\n";  // 1
    return 0;
}

ソースコードを調べようとしましたが、難しすぎました(マクロとテンプレートのコードナビゲーションが失敗します)。誰かがそれがどのように機能するか理論の探求を得ることができますか?どのように実装できるのか、私にはわかりません。

4

3 に答える 3

7

Boostは、サポートするすべてのプラットフォームのコンパイラ組み込み関数を切り替えているため、多くのマクロに遭遇しています。たとえば、Visual C ++は、がそうでない場合__is_enum(T)にどちらが返さtrueれるかを定義します。MSDNには、VisualC++が型特性サポートのために実装する組み込み関数のリストがあります。Tenumfalse

is_enum現在はC++11の一部であり、type_traitsヘッダーに含まれています。標準ライブラリの実装を調べることは、Boostヘッダーよりもおそらく簡単です。

編集:
私はBoostの実装を見つけました。にあります<boost_path>\boost\type_traits\intrinsics.hpp。このファイルでこのファイルを検索するBOOST_IS_ENUMと、さまざまなコンパイラによって実装されたコンパイラ組み込み関数が表示されます。興味深いことに、それらすべてがこの特定のものをとして実装しているよう__is_enum(T)です。

于 2012-10-26T07:49:38.097 に答える
2

boost::is_enumのように実装されstd::is_enumます。コンパイラの魔法が必要です。同じ質問がある次のリンクと実装を確認してください:is_enum実装

于 2012-10-26T07:45:17.677 に答える
1

Boostコードについては詳しく説明していませんが、単純な除去を使用しているようです。列挙型は、算術(組み込みの整数と浮動小数点型およびポインター)ではなく、参照でも、関数でも、関数でもないものです。配列ではなく、クラスまたはユニオン。

于 2012-10-26T08:07:50.623 に答える