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时,在debug模式下malloc会映射到_malloc_dbg,而在release模式下,_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
所以,这两个版本的函数可能有不同的参数,我不能只调用一个。我知道我可以做到这一点
#ifdef _DEBUG
#define Foo() first::second::DebugVersion::foo(__FILE__, __LINE__)
#else
#define Foo() first::second::ReleaseVersion::foo()
但是这样一来,我必须一直使用 Foo(),即使在最终发布模式下,它仍然是一个宏。我想知道是否有更灵活的方法可以做到这一点。
一种解决方案
#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 时可能很危险,但如果你能确保不会有,我认为这可能是一个可以接受的解决方案。