我有一个向量< std :: string>变量.我需要将它传递给接受char **作为输入参数的方法.
怎么办?如果可能,我需要通过一个可写的.
更新1:
在创建服务方法的工具中,我给参数作为std :: vector,但它会自动将限定符设置为&,这意味着我的方法定义将由以下工具生成:
std::string SvcImpl::myMethodname ( const std::string par1,const std::vector< std::string >& par2,const std::vector< std::string >& par3 ) { }
自动调用此方法,通过传递的参数中的值.
现在从这个方法里面我将在lib文件夹中的一个dll中调用一个方法,如下所示:
int method_to_be_called(char* par1,char ** par2,char ** par3,void* pRetValue);
对于par1 – >我正在传递(char *)par1.c_str()
我需要知道如何传递par2和par3以及pRetValue的变量.
par2和par3的值在向量中可用,但最后一个参数pRetValue是一个输出参数,我需要将其作为std :: string返回.
对不起,如果我很混乱或提出非常基本的问题.
解决方法
只要函数不修改char **中的传递,就可以解决问题,而不会复制所有的std :: string.否则,我可以看到没有任何选择,只能将所有内容复制到一个新的char **`结构(见第二个例子).
void old_func(char** carray,size_t size) { for(size_t i = 0; i < size; ++i) std::cout << carray[i] << '\n'; } int main() { std::vector<std::string> strings { "one","two","three"}; std::vector<char*> cstrings; for(size_t i = 0; i < strings.size(); ++i) cstrings.push_back(const_cast<char*>(strings[i].c_str())); // Do not change any of the strings here as that will // invalidate the new data structure that relies on // the returned values from `c_str()` // // This is not an issue after C++11 if(!cstrings.empty()) old_func(&cstrings[0],cstrings.size()); }
void old_func(char** carray,"three"}; char** cstrings = new char*[strings.size()]; for(size_t i = 0; i < strings.size(); ++i) { cstrings[i] = new char[strings[i].size() + 1]; std::strcpy(cstrings[i],strings[i].c_str()); } // Now the function can do what it likes (within the bounds) // with the passed in structure old_func(cstrings,strings.size()); // clean up memory for(size_t i = 0; i < strings.size(); ++i) delete[] cstrings[i]; delete[] cstrings; }
EDIT5:解决了一个更简单的解决方案,用于Post C 98代码(Thnx to BeyelerStudios)添加了一个解决方案,允许该功能修改传入的数据.