有可能吗?
如果我理解正确,则void指针可以指向任何类型。因此,模板功能(未声明的类型)是可能的吗?或void指针只保留“变量”不起作用?那么void函数指针呢?
答案 0 :(得分: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
答案 1 :(得分:0)
根据标准,void * ( 需要保存指向任何类型数据的指针)。但是,你现在可能会看到的大多数cpu架构都有数据指针和数据。大小相同的函数指针。
答案 2 :(得分:0)
这里有一个问题,因为我害怕使用的话。
指针和函数指针之间存在差异,最明显的是它们的大小不一样。
因此,使用void*
类型来保存函数指针的地址是未定义的行为。
一般来说,使用void*
在C ++中不是一个好主意。这些在C中是必要的,因为缺少适当的类型系统,但C ++类型系统更加进化(尽管不像最近的语言那样进化)。
你可能会从这里的一些客体化中受益。如果使方法成为类(模板)的实例,则可以从通用基类派生此类。这很常见,这些对象称为Functors。
但是,如果没有对您的问题进行精确描述,就很难提供更多帮助。
答案 3 :(得分:0)
使用模板执行此操作需要一些技巧,否则编译器无法消除歧义(这实际上不推荐,阅读起来很可怕,并且可能违反了几千个最佳实践)
IE:这不起作用(至少在VS08&amp; 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);
(在纯粹主义者呻吟之前,似乎C ++风格'安全'的铸造不允许这样做)