Ist es möglich, eine Namespace-Mitgliedschaft in C ++ zu erkennen?

Für C ++ - Typen wird die<type_traits> Der Header bietet uns viele nützliche Reflexionsfunktionen zur Kompilierungszeit. Z.B.std::is_base_of<B, D>::value bestimmt beim Kompilieren, obB ist eine Basisklasse vonD.

Ich frage mich, ob es möglich wäre, eine Namespace-Mitgliedschaft in ähnlicher Weise zu erkennen. Z.B. einen Namespace gegebenN mit einem TypTGibt es eine Möglichkeit, festzustellen, obT ist enthalten inN Verwenden eines Makroausdrucks des FormularsIS_NAMESPACE_MEMBER_OF(T,N).

Ich bevorzuge eine Antwort zur Kompilierungszeit mit jeder Art von SFINAE / ADL-Trick. Oder, wenn es nicht möglich ist, eine Art Begründung, warum der Standard dies nicht zulässt.

Ein nicht portierbarer Hack zur Laufzeit wäre Regextypeid(T).name() zumNDies ist jedoch ziemlich langwierig und wird nicht zur Kompilierungszeit ausgeführt.

EDIT1: Wie von K-ballo hervorgehoben, kann ein Namespace nicht als Template-Parameter verwendet werden, so dass ein Typmerkmal unmöglich erscheint.

EDIT2: Hier ist das Skelett, auf das K-Ballo hinweist: Welcher Test kann (oder kann nicht?) da oben gekocht werden?

#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!     

Antworten auf die Frage(1)

Ihre Antwort auf die Frage