是否可以在C ++中声明指向模板函数的void指针?

时间:2010-07-15 15:25:55

标签: c++

有可能吗?

如果我理解正确,则void指针可以指向任何类型。因此,模板功能(未声明的类型)是可能的吗?或void指针只保留“变量”不起作用?那么void函数指针呢?

4 个答案:

答案 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 ++风格'安全'的铸造不允许这样做)