1

*編集: どういうわけか、コンパイラがasを作成していると思ったので、継承/派生に関係なく、is_same がそれらをどのように評価するかについての私の仮定につながりました。私の悪い:(その後の誤解については申し訳ありません:\ *BA<int, int, string>

カスタムタイプをチェックするためにいくつかのメタ関数を作成し、この問題に遭遇しましたが、ここで何が起こっているのかわかりません。既知の型の this_t メンバーを、渡されたパラメーターの this_t と比較することで回避できると思いますが、1 番目と 3 番目の is_same テストが失敗する理由を理解したいだけです。

template<typename... Args> struct A {
    typedef A<Args...> this_t;
};

struct B : A<int, int, string> {
};

//tests
std::is_same<A<int, int, string>, B>::value; //false
std::is_same<A<int, int, string>, typename B::this_t>::value; //true
std::is_same<B, typename B::this_t>::value; //false

//more tests for kicks
std::is_base_of<A<int, int, string>, B>::value; //true
std::is_base_of<A<int, int, string>, typename B::this_t>::value; //true
std::is_base_of<B, typename B::this_t>::value; //false

is_same はA<...>ベースによって差別化されていますか? A<int, int, string>との明らかな違いは何Bですか?

4

3 に答える 3

4

is_same は基本的に特殊化されたテンプレートです

template<class T, class U>
struct is_same : false_type
{ };

template<class T>
struct is_same<T, T> : true_type
{ };

まったく同じタイプでない限り、それは決してあなたに真実を与えません。T専門分野には 1 つしかないことに注意してください。A と B の両方に一致することはありません。

于 2011-05-16T15:26:29.310 に答える
3

トレイトは、is_same渡された 2 つの型がまったく同じ型である場合にのみ true になります。Bと同じ型ではありませんA<int, int, string>

于 2011-05-16T15:07:50.907 に答える
2

is_same2 つの型が同じ型かどうかをテストします。

Bと同じ型ではありませんA<int, int, string>。どうしてですか?そこから派生したものです。

于 2011-05-16T15:07:45.340 に答える