私はいくつかのデバッグ情報を取得するために派手なマクロを実行しようとしました: 現在のスコープの名前! これは、アサートなどによって取得できます。私はそれを再帰的にしようとしました:
// Global namespace
struct ScopeDef{ static const char* GetName() {return "";} };
typedef ScopeDef ScopeDefParent;
// Macro to place into your namespace/scope
#define NG_SCOPEDEF(scopename) \
struct ScopeDef { \
static const char* GetName() {return scopename;} \
typedef ScopeDefParent Parent; \
}; \
typedef ScopeDef ScopeDefParent;
そしてそれを次のように使用します:
// Recursive template for testing
template< class T > void PrintImpl() {
PrintImpl< T::Parent >();
printf("::%s", T::GetName() );
}
template<> void PrintImpl< ::ScopeDef >() {}
template< class T > void PrintS() { PrintImpl<T>(); printf("\n");}
// Lets try it:
namespace First {
NG_SCOPEDEF( "First" );
namespace Second {
NG_SCOPEDEF( "Second" );
static void AFun() {
// This prints "::First::Second"
PrintS<ScopeDef>();
}
}
struct Third {
NG_SCOPEDEF( "Third" );
static void BFun() {
// This is endless recursion
PrintS<ScopeDef>();
}
};
}
定義の順序は重要ではないため、クラス スコープでは機能しません。
これは良い解決策ではありません。ある方法で親スコープにアクセスする方法はありますか? 通常のコードでは、("::First::ScopeDef") を修飾するだけですが、それはマクロでは意味がありません。