【发布时间】:2012-12-10 15:16:30
【问题描述】:
我正在构建一个需要将字符串映射存储到函数指针的 C++ 程序。但是,每个函数可能有不同的返回类型和参数。我试图解决这个问题的方法是通过创建函数来获取一个 void 指针数组并返回一个 void 指针数组,然后根据需要转换参数和返回值。
为了弄清楚它是如何工作的,我正在尝试构建一个简单的虚拟对象,但无法编译它。我尝试了很多事情,但我不断收到不同的错误。这是一个例子:
#include <string>
#include <iostream>
#include <map>
using namespace std;
void** string2map(void** args){
//takes a string of the form "key:value;key:value;..." and returns a map<string,string>
string st = *((string**) args)[0];
map<string, string> result = map <string, string>();
//code doesnt matter
return (void*) &((void*) &result);
}
int main(){
string test = "hello:there;how:are you?";
map<string, string> result = *(map<string, string>**)string2map((void*) &((void*) &test))[0];
return 0;
}
当我尝试编译时,我得到:
void.cpp: In function 'void** string2map(void**)':
void.cpp:12:34: error: lvalue required as unary '&' operand
void.cpp: In function 'int main()':
void.cpp:17:89: error: lvalue required as unary '&' operand
显然这里有很多问题,但我真的不知道从哪里开始。谁能告诉我上面的代码有什么问题,或者给我一个替代我目前这样做的方式?
注意
我返回void** 而不仅仅是void* 的原因是可能存在我需要返回多个不同类型的值的情况。一个例子是,在上面,我想返回结果映射和映射中的条目数。不过,我什至还没有弄清楚如何构造该数组。
编辑
因此,根据迄今为止的回复,很明显这是解决此问题的错误方法。考虑到这一点,有人能推荐一个更好的吗?我需要能够将各种函数存储在单个映射中,这意味着我需要能够为接受和返回不同类型的函数定义单一数据类型。能够返回多个值也很重要。
【问题讨论】:
-
按照你写的方式,不管你做什么都是错误的,因为你返回的是一个非静态局部变量的地址。
-
另外,请考虑在代码中标记与错误消息中指示的行匹配的行。一眼就知道哪一行是 12 和 17 并不容易。
-
你真的只需要一个
void *参数。如果你需要更多,你总是可以将那个参数设为向量或结构。 -
&((void*) &test)本质上是&&test,你不能那样做。 -
It's better if we don't answer this straight. 你能告诉我们你想用这个设计解决什么问题吗?
标签: c++ arrays function-pointers void-pointers