10

在 C++ 中是否可以创建某种通用函数指针,该指针指向任何返回指向某种类型的指针且不带参数的函数?

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

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;

但是是否可以执行以下操作(此时会出现编译错误):

void* (*funcPointerC)() = funcInt;
void* (*funcPointerD)() = funcChar;

目前上面的代码给出了以下错误:

error: invalid conversion from 'int* (*)()' to 'void* (*)()'
error: invalid conversion from 'char* (*)()' to 'void* (*)()'

有没有办法将 funcPointerA 和 B 转换为 C 和 D?

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

4

2 回答 2

9

有没有办法将 funcPointerA 和 B 转换为 C 和 D?

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

void* (*funcPointerC)() = reinterpret_cast<void*(*)()>(funcInt);

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

于 2013-05-12T15:22:59.790 回答
8

标准不允许这样的事情。您可能会也可能无法摆脱将函数指针转换为void* (*)(). 在 C++ 中有符合标准的解决方案。这是一个简单的 pre-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;
};

现在您可以存储shared_ptr<Myfunc>在您的向量中。

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

template <typename T>
std::function<void*()> castToVoidFunc (T* (*func)())
{
  return [=](){ return func(); };
}
于 2013-05-12T15:41:52.913 回答