指向void *函数C ++的指针

时间:2017-11-07 04:13:09

标签: c++ pthreads function-pointers void-pointers

我试图在main方法中调用指向void *函数的指针,编译器正在说assigning to 'funcptr<g>' from incompatible type 'void *(void *)hello函数实际上是pthread_create函数的参数。这就是void *功能的原因。如何创建指向void *函数的函数指针?

#include <iostream> 
#include <pthread.h> 

using namespace std; 

template<typename T> 
using funcptr = void (*T::*)(void *); // I think it is wrong here.

class m { 
public: 
    template <typename T> 
    struct my_struct { 
        funcptr<T> ptr; 
    };
}; 

class g { 
public: 
    static void *hello(void *); 
}; 

int main() { 
    struct m::my_struct<g> h; 
    h.ptr = g::hello; // Error here

    return 0; 
}

2 个答案:

答案 0 :(得分:2)

  

如何创建一个指向void *函数的函数指针?   hello不是会员功能,但它是静态功能。

因此,您的funcptr应如下所示:

// No template needed.
using funcptr = void* (*)(void *)

请注意,hello声明为静态meaning that it's no longer a member function to g

  

类的静态成员与类的对象关联。

因此使用void (*T::*)(void *)来剔除非成员函数是不正确的。

如果您被允许使用支持C ++ 11的编译器,您甚至不需要使用decltype 手动扣除其类型:

// decltype deducts its exact type for you.
using funcptr = decltype(&g::hello);

class m 
{ 
public: 
    struct my_struct 
    { 
        funcptr ptr; 
    };
}; 

仅供参考,由于hello没有定义,您可能会遇到链接错误。为了防止这种情况,我假设其中有一些实现:

static void *hello(void *) 
{ 
    // Meaningless, but..
    return nullptr;
}

答案 1 :(得分:1)

如果你正在使用C ++ 11,你可以使用std::function<>,这只会影响函数的返回类型和参数,而不是它们的定义位置和类型。

以下是使用std::function<>

的代码
#include <iostream> 
#include <functional>
#include <pthread.h> 

using namespace std; 

class m { 
public: 
    template <typename T> 
    struct my_struct { 
        function<void*(void*)> ptr;
    };
}; 

class g { 
public: 
    static void *hello(void *) {
        cout<<"Hello.."<<endl;
    }
}; 

int main() { 
    struct m::my_struct<g> h; 
    h.ptr = g::hello;
    h.ptr(nullptr);

    return 0; 
}