C ++返回一个void指针数组

时间:2012-10-11 11:48:19

标签: c++ void-pointers

  

可能重复:
  C++ return array from function

我正在尝试声明一个返回void指针数组的函数。我有以下代码:

void *[] get_functions();

但是我收到了编译错误:expected unqualified-id before '[' token

我正在尝试做的是有效的,如果是的话,我的语法错误是什么?

修改 在回复一些注释时,我试图返回一个函数的数组(现在可能是一个向量),然后我可以随机选择一个并调用它。你会建议什么而不是void *

编辑2 返回的函数类型将有一个固定的签名(尚未决定),为了论证,让我们说签名将是int f(int i,int j)我的get_functions函数的返回值是什么样的,或者vector<void*>仍然合适吗?

4 个答案:

答案 0 :(得分:7)

C ++不允许函数返回数组。你可能应该返回一个向量:

std::vector<void *> get_functions();

答案 1 :(得分:2)

您的方法存在两个问题。第一个是你不能从函数返回数组。在C中,您将返回指向数组中元素的指针,但这意味着您需要管理内存。在C ++中,您可以使用容器,如std::vector而不是数组,并且可以按值返回。

第二个问题是您正在返回函数指针,并且标准无法保证从函数指针到void*的转换。这里的替代方法首先返回适当类型的函数指针(即std::vector<int (*)(int,int)>)或使用更高级别的结构,如std::function(C ++ 03中的C ++ 11或boost::function) :std::vector<std::function<int(int,int)>>。第一种方法更适合您提供的描述,因为函数的类型似乎是固定的,并且使用函数指针的开销很小。第二种方法更通用,因为它可以封装任何可用两个int调用的东西并返回int ,包括函数指针和函数对象。这反过来允许您通过std::bind调整其他函数的签名或使用适当的签名创建lambdas:[](int x, int y){ return x*y;}

答案 2 :(得分:1)

void **get_functions();

稍后您可以说:

void **pp = get_functions();
pp[5];     // This is the sixth pointer-to-void

如果您还不知道数组的长度,则需要以其他方式传递 - 因此,Jerry Coffin的答案可能更好。

答案 3 :(得分:0)

你可以只返回指向数组第一个元素的void指针。你可以把它放在调用函数中。 数组本身作为指针传递/返回。

相关问题