检查函数指针的属性?

Posted

技术标签:

【中文标题】检查函数指针的属性?【英文标题】:Checking attributes of a function pointer? 【发布时间】:2013-11-30 17:24:40 【问题描述】:

假设我在通用上下文中有以下代码;

auto function = T::getFunctionPtr();

是否可以在编译时检查 'function' 是全局函数还是静态类方法?

【问题讨论】:

我不这么认为,静态成员函数和非成员函数没有太大区别。你为什么需要这个? @zch:我同意,差别不大,而且我一直无法找到查询静态性的方法,因此提出了这个问题。另外我没有现实生活中的应用程序,我只是好奇是否可以使用模板来决定。 如果我理解正确,T::getFunctionPtr() 返回一个函数指针,即类似于void (*)(int, char) 的类型。那么此时返回的指针可以无差别地指向全局函数或者静态成员函数。从 T::getFunctionPtr() 的定义中可见的差异(范围、可访问性)在您获得指针后不再可见。 (现在这不是一个真正的答案,所以我只是发表评论。) @gx_:假设您更改上面的代码,使其声明T::some_function_name 而不是T::getFunctionPtr(),您将如何判断此函数是否为静态函数?我在想,可以使用 SFINAE,基于这样一个事实:T::some_function_name,其中some_function_name 是非静态函数会产生类似的错误; call to non-static member function without an object argument,虽然它在静态情况下成功,但我似乎无法找到在这种情况下使用 SFINAE 的方法。 @Skeen 您不是要求区分全局(非成员) 函数和静态成员 函数吗? T::some_function_name 显然不能是全局的(假设 T 是一种类型)。如果现在您要求区分 non-static member 函数和 static member 函数,您应该编辑您的问题,但这意味着两种不同的指针类型(例如void (Foo::*)(int, char) vs void (*)(int, char))。 【参考方案1】:

在编译时检查“function”是全局函数还是静态类方法的唯一方法是检查“T::getFunctionPtr()”的返回类型。但是全局函数和静态类方法具有相同的类型,如下所示:

#include <iostream>
#include <typeinfo>
using namespace std;

void GlobalFunc() 

class A 
  public:
    static void StaticFunc() 
;

int main() 
  cout << std::boolalpha;
  cout << (typeid(GlobalFunc) == typeid(A::StaticFunc)) << endl;
  return 0;

输出“真”。 http://ideone.com/oo70F9 。 所以答案是否定的,你不能在编译时这样做。

【讨论】:

以上是关于检查函数指针的属性?的主要内容,如果未能解决你的问题,请参考以下文章

检查指针在析构函数中不为空[重复]

如何使用内置函数而不是 NULL 检查来验证指针?

检查指针是不是已分配内存

使用智能指针属性创建setter函数? [关闭]

成员函数指针作为构造函数参数

C ++使用成员函数返回结构指针属性的值