2010-07-15 84 views

回答

1

您可以将任何函数指针类型转换为任何其他函数指针类型,但在调用它之前,最好将其转换为正确的类型。因此,您可以使用void(*)()作为等效于void*的函数指针。这也适用于功能模板。

template<typename T> 
void f(T){} 

typedef void(*voidfp)(); 

voidfp fp=static_cast<voidfp>(&f<int>); // store address of f(int) in variable 
static_cast<void(*)(int)>(fp)(3); // call the function 

fp=static_cast<voidfp>(&f<std::string>); // store address of f(std::string) in variable 
static_cast<void(*)(std::string)>(fp)("hello"); // call the function 
0

根据标准,一个void *是能够保持一个函数指针需要。 (它需要来保存指向任何类型数据的指针)。然而,你现在可能会看到的大多数cpu架构都有数据指针&函数指针,它们的大小相同。

0

这里有一个问题,因为我害怕的话。

指针函数指针之间的区别,最明显的是,他们不必是相同的尺寸。

因此,使用void*类型来保存函数指针的地址是未定义的行为。

一般来说,在C++中使用void*并不是一个好主意。这些对于C来说是必要的,因为缺乏适当的类型系统,但是C++类型系统更加发展(尽管不像最近的语言那样发展)。

你可能会从这里的一些客观事物中受益。如果你让你的方法成为一个类的实例(模板),你可以从一个公共基类派生这个类。这很常见,这些对象被称为Functors。

但是,如果没有您的问题的确切描述,将很难提供更多帮助。

0

与你需要一些挂羊头卖狗肉的模板做到这一点,否则编译器不能消除歧义的功能(这实在是不推荐的,其可怕的阅读,并可能违反了几千porgamming最佳实践)

IE:此不工作(ATLEAST下VS08 & GCC 3.5):

template <typename tType> tType* GetNULLType() 
{ 
    return static_cast<tType*>(0); 
} 

void* pf = static_cast<void*>(GetNULLType<int>); 

你,而不是需要做的:

template <typename tType> tType* GetNULLType() 
{ 
    return static_cast<tType*>(0); 
} 

typedef int* (*t_pointer)(); 
t_pointer pfGetNull = GetNULLType<int>; 
void* pfVoid = (void*)(pfGetNull); 

(一d纯粹主义者呻吟之前,似乎C++风格的'安全'铸造不会允许这样)