C++ c++;,指针,引用,从一个函数传递到另一个函数,std::vector,std::string

C++ c++;,指针,引用,从一个函数传递到另一个函数,std::vector,std::string,c++,string,pointers,vector,reference,C++,String,Pointers,Vector,Reference,我对指针和引用、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&

我对指针和引用、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]
}
//首先:这个函数声明好吗?
//或者我应该用另一种方式传递std::vector吗?
//我只是在读它
void func(常量标准::向量和向量)
{
//我需要使用vec中的单个元素调用otherFunc(void*):
//otherFunc(void*arg);
//arg为空*至向量[0]
}
我的IDE告诉我,只有
和*vec[0]
可以作为
其他函数的参数,但这不会编译


这种参数传递的最佳方式是什么?

首先,
&*vec[0]
是没有意义的;您可能是指
&vec[0]
(即向量中第一个字符串的地址)

但即使这样也无法编译,因为
&vec[0]
的类型是
const std::string*
。最重要的是,它是
const
。您可以这样做:

otherFunc(const_cast<std::string *>(&vec[0]));
otherFunc(const_cast(&vec[0]);

但是试图在
void*
的上下文中使用
const std::string*
听起来是个非常糟糕的主意。那怎么可能有用呢?

首先,
&*vec[0]
毫无意义;您可能是指
&vec[0]
(即向量中第一个字符串的地址)

但即使这样也无法编译,因为
&vec[0]
的类型是
const std::string*
。最重要的是,它是
const
。您可以这样做:

otherFunc(const_cast<std::string *>(&vec[0]));
otherFunc(const_cast(&vec[0]);

但是试图在
void*
的上下文中使用
const std::string*
听起来是个非常糟糕的主意。这怎么可能有用呢?

首先,因为您只读取向量,所以将其作为
常量
引用传递是一个好主意,应该可以很好地工作


关于第二个问题:很难说
otherFunc
会对对象做什么,因为它需要一个
void
指针。这是C++风格,不应该在C++中使用,有更好的和类型安全的方法。

首先,因为您只从vector中读取,将其作为<代码> const >引用是一个好主意,并且应该工作得很好。


关于第二个问题:很难说
otherFunc
会对对象做什么,因为它需要一个
void
指针。这是C风格,不应该在C++中使用,有更好的和类型安全的方法来做。

这是一个很好的声明,只要函数不打算修改向量。它比按值传递更有效,因为它避免了复制向量——这是一个需要内存分配的昂贵操作

但是,另一个函数需要一个非常量指针。如何处理此问题取决于它是否可能修改数据

如果它不会(正如你说的“我只是在读它”)那么选项是:

  • 将其更改为
    otherFunc(void const*arg)
    ,以提供更有力的保证,确保它不会更改,或者
  • 调用
    const_cast
    时,使用
    const_cast
    删除
    const限定符
请注意,
和*vec[0]
不会编译;您需要
vec[0].c_str()
获取指向第一个字符串数据的c兼容指针,前提是您需要该指针


如果它可能修改向量,那么您必须做一些其他的事情,因为没有合法的方法通过指向其数据的指针修改
std::string
。最好的选择可能是使用
std::vector
而不是
std::string
,但这完全取决于函数的功能。

这是一个很好的声明,只要函数不打算修改向量。它比按值传递更有效,因为它避免了复制向量——这是一个需要内存分配的昂贵操作

但是,另一个函数需要一个非常量指针。如何处理此问题取决于它是否可能修改数据

如果它不会(正如你说的“我只是在读它”)那么选项是:

  • 将其更改为
    otherFunc(void const*arg)
    ,以提供更有力的保证,确保它不会更改,或者
  • 调用
    const_cast
    时,使用
    const_cast
    删除
    const限定符
请注意,
和*vec[0]
不会编译;您需要
vec[0].c_str()
获取指向第一个字符串数据的c兼容指针,前提是您需要该指针


如果它可能修改向量,那么您必须做一些其他的事情,因为没有合法的方法通过指向其数据的指针修改
std::string
。最好的选择可能是使用
std::vector
而不是
std::string
,但这完全取决于函数的功能。

您需要解释要传递给函数的内容。“空虚”本身是没有意义的。要使用“void*”,必须先将其转换为其他类型。那么,函数将如何处理“void*”?我不知道,因为它来自外部库。我无法更改
otherFunc(void*)
,我只能更改我自己的
func()
。您需要解释要传递给函数的内容。“空虚”本身是没有意义的。要使用“void*”,必须先将其转换为其他类型。那么,函数将如何处理“void*”?我不知道,因为它来自外部库。我不能更改
otherFunc(void*)
,我只能更改我自己的
func()