C++ 型の場合、<type_traits>
ヘッダーは多くの便利なコンパイル時のリフレクション機能を提供します。たとえば、 が の基底クラスであるstd::is_base_of<B, D>::value
かどうかをコンパイル時に判断します。B
D
同様の方法で名前空間のメンバーシップを検出することは可能でしょうか? たとえばN
、タイプの名前空間が与えられた場合、フォームのマクロ式を使用して 含まれているT
かどうかを判断する方法はありますか。T
N
IS_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!