使用C++元编程,如何判断你是在类方法中还是静态/全局函数中?

问题描述 投票:0回答:1

有没有办法确定当前作用域是全局函数/静态类方法还是类方法?

我想到了

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
c++ template-meta-programming
1个回答
0
投票

您可以实现一个函数

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
}
© www.soinside.com 2019 - 2024. All rights reserved.