有没有办法确定当前作用域是全局函数/静态类方法还是类方法?
我想到了
this
的存在,但是我无法找到一种在它不存在时在编译过程中不会出错的技术。
我想要一个可以在成员方法或全局函数中使用的函数原型,但它的行为确实不同。无需在我的课程中添加任何内容。
一个例子:
class NormalClass
{
public:
void foo(int a, bool b)
{
DEBUG("print from class %d %d\n", a, b);
}
};
void normal_function()
{
DEBUG("print from a normal function");
}
打印输出
Class: print from class 1, 2
Global: print from a normal function
您可以实现一个函数
is_static_scope
,当在静态方法或命名空间范围内的函数内调用时返回 true,在非静态成员函数内调用时返回 false。该函数的唯一参数是您所在函数的地址:
void glob() {
is_static_scope(&glob); // has value true
}
struct S {
void bool foo() {
is_static_scope(&S::foo); // has value true
}
void bar() {
is_static_scope(&S::bar); // has value false
}
};
该函数可以通过重载函数指针具有的不同类型来实现:非成员/静态函数具有类型
Ret(*)(Args...)
,而成员函数指针看起来像 Ret(C::*)(Args...)
。所以过载就是:
template<typename Ret, typename ...Args>
bool is_static_scope(Ret(*)(Args...)) {
return true; // must be in a non-member/static function
}
template<typename C, typename Ret, typename ...Args>
bool is_static_scope(Ret(C::*)(Args...)) {
return false; // must be in a member-function
}