在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?
这是两种函数类型的指针(以及其他在不带参数的情况下返回指向某种类型的指针的函数)可以一起存储在一个向量中。
答案 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);
但是调用强制转换结果是未定义的行为,您必须先将其强制转换回原始类型。如果您可以记录原始类型并安排指针回放到该原始类型,那么您的代码可以正常工作。