6

C++ でのメタプログラミングの多くの例を見た後、クラスの多くのプロパティ (型がテンプレートの特殊化であるかどうかを知るなど) を把握したり、クラスが特定のネストされた型を組み込んでいるかどうかを知ることができます。しかし、最後のものの逆を決定するテストまたは特性を書くことが可能かどうか疑問に思っていましTypeた.classstruct

つまり、次の疑似コードに相当するものを探しています。

template <typename Type> struct is_nested {
    enum { value = {__some magic__} };
};

typedef int type1;
struct Something { typedef int internal_type; };
typedef Something::internal_type type2;

//...later, likely at a different scope

is_nested< int >::value; // yields false
is_nested< std::vector<int>::iterator >::value; // yields true
is_nested< type1 >::value; // yields false
is_nested< type2 >::value; // yields true

sizeofはい/いいえテストを実装するために使用できることはわかってTypeおり、それらのテストの一部であると推測しますが、式を形成できるように、ある種の「実行可能なタイプ」をテストにプラグインする方法がわかりませんのようにAnytype::Type

テンプレート
構造体 is_nested
{
    typedef char はい;
    typedef struct { char u[2]; } 番号;

    // ここに問題があります
    ???? static はい test( char [ sizeof(Anytype::Type) ] ) ;
    ???? 静的テストなし(...);


公衆:
    enum { 値 = sizeof(test(0)) == sizeof(char) };
};

(私は、どの型が入れ子になるかは気にしないし、知ることもできないことに注意してください。重要なのは、それが何かTypeに入れ子にされているかどうかだけです。つまり、この特性はにのみ依存する必要があります。)Type

私は C++11 または C++03 の C++ ソリューションを探していますが、最初のケースでは、バックポート可能であればもっと歓迎します。

4

2 に答える 2