你能从"volatile const char*"构造一个字符串吗?(不使用`const_cast`
Can you construct a string from `volatile const char*` ? (without using `const_cast`)
基本上我有volatile const char*
,并且想要创建一个string
。这里的volatile
关键字很可能是不相关的(来自前一个开发人员的误解(,但无法轻易消除它(来自其他库(。
cannot convert argument N from 'volatile const char *' to 'std::string
我可以使用const_cast
来强制转换volatile
(并使编译器忽略volatile
/const
(。我对不使用const_cast
的解决方案感兴趣。
是否存在其他方法,例如使用stringstream
可能是一种解决方案?
只使用for循环,可能是一个选项:
volatile const char* cstr = "hello world";
std::string str;
for (volatile const char* pC = *cstr ; *pC != 0; ++pC) {
str.push_back(*pC);
}
您可以使用STL算法std::transform()
对C字符串进行逐元素复制。
转换函数将有效地将每个volatile const char
转换为char
——这种转换在没有const_cast
的情况下有效。使用std::back_inserter()
,可以将生成的字符附加到std::string
的末尾。
#include <iostream>
#include <string>
#include <algorithm>
int main()
{
volatile const char* cstr = "hello";
std::size_t len = 6; // your string's length
// this implicitly converts 'volatile const char' argument to 'char' parameter
auto func = [] (char c) { return c; };
std::string str;
std::transform(cstr, cstr + len, std::back_inserter(str), func);
std::cout << "string=" << str << ".n"; // outputs: string=hello.
}
请注意,由于同样的原因,您不能使用std::strlen()
——如果您没有大小,则需要编写自己的循环来计算它。