C ++是否可以使用通用函数指针?

时间:2013-05-12 15:09:06

标签: c++ function generics pointers

在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?

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

2 个答案:

答案 0 :(得分:6)

标准不允许这样的事情。您可能会或可能无法将函数指针转换为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;
};

现在,您可以将shared_ptr<Myfunc>存储在矢量中。

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

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

答案 1 :(得分:5)

  

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

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

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

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