namespace first {
namespace second {
class Third {
static void foo() {
std::cout << "foo\n";
}
};
}
}
void bar() {
std::cout << "bar\n";
}
#define first::second::Third::foo bar//this doesn't work
では、ネストされた関数を別の関数にマップする正しい方法は何ですか?
アップデート:
より類似した状況は次のとおりです。
struct ReleaseVersion {
static void foo() {
std::cout << "release version\n";
}
};
struct DebugVersion {
static void foo() {
std::cout << "debug version\n";
}
};
#ifdef _DEBUG
#define ReleaseVersion::foo DebugVersion::foo
#else
#define DebugVersion::foo ReleaseVersion::foo
#endif
私がやりたいのは、mallocや_malloc_dbgと同じです。デバッグモードでは、#define _CRTDBG_MAP_ALLOCが_malloc_dbgにマップされ、リリースモードでは、_malloc_dbgがmallocにマップされます。
再度更新する
より類似した状況は次のとおりです。
namespace first {
namespace second {
struct ReleaseVersion {
static void foo() {
std::cout << "release version\n";
}
};
struct DebugVersion {
static void foo(const char* file, long line) {
std::cout << "debug version\n";
}
};
}
}
#ifdef _DEBUG
#define ReleaseVersion::foo() DebugVersion::foo(__FILE__, __LINE__)
#else
#define DebugVersion::foo(file, line) ReleaseVersion::foo()
#endif
したがって、これらの2つのバージョンの関数は異なるパラメーターを持っている可能性があり、1つだけを呼び出すことはできません。私はこれができることを知っています
#ifdef _DEBUG
#define Foo() first::second::DebugVersion::foo(__FILE__, __LINE__)
#else
#define Foo() first::second::ReleaseVersion::foo()
しかし、このように、私は常にFoo()を使用する必要があります。最終リリースモードでも、それはまだマクロです。これを行うためのより柔軟な方法があるかどうか知りたいです。
1つの解決策
#ifdef _DEBUG
#define foo() foo(__FILE__, __LINE__)
#define ReleaseVersion DebugVersion
#else
#define foo(file, line) foo()
#define DebugVersion ReleaseVersion
#endif
int main() {
first::second::DebugVersion::foo(__FILE__, __LINE__);
first::second::ReleaseVersion::foo();
return 0;
}
他の名前空間に別のfoo()またはRealeaseVersion / DebugVersionがある場合は危険かもしれませんが、ないことを確認できれば、許容できる解決策になると思います。