4

C++ 型の場合、<type_traits>ヘッダーは多くの便利なコンパイル時のリフレクション機能を提供します。たとえば、 が の基底クラスであるstd::is_base_of<B, D>::valueかどうかをコンパイル時に判断します。BD

同様の方法で名前空間のメンバーシップを検出することは可能でしょうか? たとえばN、タイプの名前空間が与えられた場合、フォームのマクロ式を使用して 含まれているTかどうかを判断する方法はありますか。TNIS_NAMESPACE_MEMBER_OF(T,N)

私は、あらゆる種類の SFINAE / ADL タイプのトリックによるコンパイル時の回答を好みます。または、それが不可能な場合は、標準がこれを許可しない理由のいくつかの並べ替え。

移植性のない実行時のハックは、 の正規表現typeid(T).name()になりますNが、これはかなり面倒で、コンパイル時ではありません。

EDIT1 : K-ballo で指摘されているように、名前空間はテンプレート パラメーターとして使用できないため、型特性は不可能に見えます。

EDIT2 : K-ballo によって示唆されたスケルトンは次のとおりです。そこで調理できる (またはできない?) 気の利いたテストは何ですか?

#define IS_NAMESPACE_MEMBER_OF(T, N) \
                                     \
// global declaration                \
void test(T);                        \
                                     \
// namespace declaration             \
namespace N {                        \
    void test(T);                    \
}                                    \
                                     \
// some clever name lookup / sizeof / SFINAE test!     
4

2 に答える 2

4

名前空間は有効なテンプレート パラメーターではないため、クラスの特性になることはありません。ただし、マクロを使用して何かあいまいなことを行うことができるかもしれません。sizeoftest 名前空間に関数を挿入し、ADL を/トリックと一緒に使用して、decltypeどのオーバーロードが選択されるかを確認できます。

于 2012-05-18T18:15:29.580 に答える