C++;是否可以有一个通用函数指针? 在C++中,是否可以生成某种泛型函数指针,指针指向返回某个类型的指针的函数,不带任何参数?

C++;是否可以有一个通用函数指针? 在C++中,是否可以生成某种泛型函数指针,指针指向返回某个类型的指针的函数,不带任何参数?,c++,function,generics,pointers,C++,Function,Generics,Pointers,例如,一种类型的指针可以指向以下两种: int* funcInt(){ int* i = new int; *i = 5; return i; } char* funcChar(){ char* c = new char; *c = 'a'; return c; } 显然,以下内容是有效的: int* (*funcPointerA)() = funcInt; char* (*funcPointerB)() = funcChar; 但是否可以执

例如,一种类型的指针可以指向以下两种:

int* funcInt(){
    int* i = new int;
    *i = 5;
    return i;
}

char* funcChar(){
    char* c = new char;
    *c = 'a';
    return c;
}
显然,以下内容是有效的:

int* (*funcPointerA)() = funcInt;
char* (*funcPointerB)() = funcChar;
但是否可以执行以下操作(此时会出现编译错误):

目前,上述代码给出以下错误:

error: invalid conversion from 'int* (*)()' to 'void* (*)()'
error: invalid conversion from 'char* (*)()' to 'void* (*)()'
有没有办法把A和B转换成C和D

这使得指向这两种类型函数的指针(以及其他返回指向某个类型的指针但不带参数的函数)可以存储在一个向量中

有没有办法把A和B转换成C和D

可以,可以将一种类型的函数指针显式转换为另一种类型:

void* (*funcPointerC)() = reinterpret_cast<void*(*)()>(funcInt);
void*(*funcPointerC)(=重新解释强制转换(funcInt);

但是调用强制转换的结果是未定义的行为,必须首先将其强制转换回其原始类型。如果您可以记录原始类型并安排将指针转换回该原始类型,那么您的代码就可以工作。

标准不允许这样做。将函数指针强制转换为
void*(*)()
,您可能会,也可能不会成功。在C++中有标准的一致性解决方案。下面是一个简单的C++11之前版本:

struct MyFunc
{
  virtual void* operator()() = 0;
  virtual ~Myfunc(){}
};

template <typename T>
struct MyfuncImpl
{
  typedef T TFunc();
  MyfuncImpl (TFunc* func) : m_func(func) {}
  void* operator()() { return m_func(); }
 private:
  TFunc* m_func;
};
struct MyFunc
{
虚空*运算符()()=0;
虚拟~Myfunc(){}
};
模板
结构MyfuncImpl
{
typedef T TFunc();
MyfuncImpl(TFunc*func):m_func(func){}
void*运算符()({return m_func();}
私人:
TFunc*m_func;
};
现在您可以在向量中存储
shared\u ptr

C++11中更好的解决方案如下所示:

template <typename T>
std::function<void*()> castToVoidFunc (T* (*func)())
{
  return [=](){ return func(); };
}
模板
std::函数castToVoidFunc(T*(*func)()
{
return[=](){return func();};
}

好的,有没有一种简单的方法来存储和稍后检索类型,以便可以将其回滚?没有,您需要存储一些枚举或整数代码,说明原始类型是什么,这意味着您必须提前知道可能要存储在向量中的所有可能类型。如果您不需要返回原始类型,只需通过调用函数返回
void*
就可以了,那么@n.m.的类型擦除解决方案更简单、更干净,我需要它来比较函数的标识,而不是调用它们,所以这个解决方案对我来说非常好。是否也适用于成员函数?@N0vember yes将指向成员函数的指针转换为其他类型的指向成员函数的指针,然后再转换回来是有效的。在重新转换之前对其执行任何操作都是未定义的。您不能将其转换为指向非成员函数的指针。该标准允许转换函数指针,请参见[expr.reinterpret.cast]/6,它只是不允许在转换后调用它们。C++11解决方案中的lambda是不必要的,
std::function
将返回值转换为
R
,如果存在隐式转换序列,那么您只需
返回std::function(func)
请参见[func.wrap.func]/2,其中说明调用
std::function
使用INVOKE(…,R)形式,[func.require]/2将其定义为隐式地将结果转换为
R
template <typename T>
std::function<void*()> castToVoidFunc (T* (*func)())
{
  return [=](){ return func(); };
}