我有一个指针和引用的特定问题,std :: vector和std :: string。有些问题在以下代码中被剪切,一些在下面。
我基本上有这段代码
//first of all: is this function declaration good?
//or shoudl I already pass the std::vector in another way?
//I'm only reading from it
void func(const std::vector<std::string>& vec)
{
//I need to call otherFunc(void*) with a single element from vec:
//otherFunc(void* arg);
//with arg being a void* to vec[0]
}
我的IDE告诉我只有&*vec[0]
作为otherFunc
的参数,但这不会编译......
如何进行这类参数传递的最佳方法是什么?
答案 0 :(得分:2)
这是一个很好的声明,只要该函数不是为了修改向量。它比传递值更有效,因为它避免了复制向量 - 这是一项需要内存分配的昂贵操作。
但是,另一个函数需要一个非const指针。如何处理这取决于它是否可以修改数据。
如果它不会(正如你所说的那样,“我只是从中读取它”)那么选项是:
otherFunc(void const * arg)
,以更好地保证不会,或const
时删除const_cast<void*>
资格请注意,&*vec[0]
将无法编译;你希望vec[0].c_str()
获得与第一个字符串数据的C兼容指针,假设这是你需要的。
如果它可能修改了向量,那么你将不得不做其他事情,因为没有合法的方法通过指向其数据的指针来修改std::string
。可能最好的选择是使用std::vector<char>
而不是std::string
,但这取决于函数的确切功能。
答案 1 :(得分:1)
首先,&*vec[0]
毫无意义;你可能意味着&vec[0]
(即你向量中第一个字符串的地址)。
但即使这样也无法编译,因为&vec[0]
的类型为const std::string *
。最重要的是,它是const
。你可以这样做:
otherFunc(const_cast<std::string *>(&vec[0]));
但是!!! 尝试在const std::string *
的上下文中使用void *
听起来非常糟糕。怎么可能做任何有用的事情?
答案 2 :(得分:1)
首先,由于您只是从向量中读取,将其作为const
引用传递是一个好主意,应该可以正常工作。
关于你的第二个问题:很难说otherFunc
会对你的对象做什么,因为它需要一个void
指针。这是C风格,不应该在C ++中使用,有更好的和类型安全的方法。