5

sfinae を使用して名前空間メンバーの存在をテストできるかどうかを調べようとしていました。Googleはそれについてかなり沈黙しています。次のコードを試しましたが、失敗します。

namespace xyz{
 struct abc{};
}

struct abc{};

struct test_xyz{ 
 typedef char yes;
 typedef struct{ char a[2]; } no;

 template <class C> static yes test(xyz::C = xyz::C()); //lets assume it has default constructor
 template <class C> static no test(...);

 const bool has_abc = sizeof(test_xyz::test<abc>()) == sizeof(yes);
};

理由はありますか?

よろしく、

4

1 に答える 1

10

いいえ、うまくいきません。そのような方法で SFINAE を使用する方法もありません (これは、いくつかの C++0x コンポーネントに対する互換性テストのために usenet で最後に議論されました)。内部の Cxyz::Cは、テンプレート パラメータとはまったく関係ありません。

テンプレートは単なるマクロではないことに注意してください。パラメータCは単なるテキストではなく、セマンティック エンティティを示します。この場合はタイプです。それはすでに引数としての意味にバインドされています。つまり、クラスに name のメンバーがあったとしてもabc、パラメーターの意味は変わりません。

xyz::abc構造体が存在する場合はそれを使用するothers::abcことだけが必要な場合、そうでない場合は、そこに到達するためにいくつかのトリックを実行できますが、触れずにそれを行う方法を知りませんxyz

namespace others {
  struct abc{};
}

namespace fallbacks {
  using others::abc;
}

namespace xyz {
  using namespace fallbacks;
}

xyz::abcと宣言されたメンバーが含まれている場合xyz、そのメンバーを参照します (そのメンバーは のメンバーを非表示にしfallbacksます。ただし、そのメンバーが含まれていない場合は、using ディレクティブの名前が見つかり、 を参照しfallbacks::abcます。

于 2010-08-30T12:29:49.583 に答える