这可能吗?是否可以在C++中声明指向模板函数的void指针?
如果我已经理解是正确的,void指针可以指向任何类型。因此,模板函数(未声明类型)是可能的?或void指针只能保留为“变量”不起作用?那么void函数指针呢?
这可能吗?是否可以在C++中声明指向模板函数的void指针?
如果我已经理解是正确的,void指针可以指向任何类型。因此,模板函数(未声明类型)是可能的?或void指针只能保留为“变量”不起作用?那么void函数指针呢?
您可以将任何函数指针类型转换为任何其他函数指针类型,但在调用它之前,最好将其转换为正确的类型。因此,您可以使用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
根据标准,一个void *是不能够保持一个函数指针需要。 (它需要是来保存指向任何类型数据的指针)。然而,你现在可能会看到的大多数cpu架构都有数据指针&函数指针,它们的大小相同。
这里有一个问题,因为我害怕的话。
有指针和函数指针之间的区别,最明显的是,他们不必是相同的尺寸。
因此,使用void*
类型来保存函数指针的地址是未定义的行为。
一般来说,在C++中使用void*
并不是一个好主意。这些对于C来说是必要的,因为缺乏适当的类型系统,但是C++类型系统更加发展(尽管不像最近的语言那样发展)。
你可能会从这里的一些客观事物中受益。如果你让你的方法成为一个类的实例(模板),你可以从一个公共基类派生这个类。这很常见,这些对象被称为Functors。
但是,如果没有您的问题的确切描述,将很难提供更多帮助。
与你需要一些挂羊头卖狗肉的模板做到这一点,否则编译器不能消除歧义的功能(这实在是不推荐的,其可怕的阅读,并可能违反了几千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++风格的'安全'铸造不会允许这样)