Можете ли вы построить строку из `volatile const char *`? (без использования `const_cast`) - PullRequest
2 голосов
/ 11 ноября 2019

В основном у меня есть volatile const char* и я хочу создать string. Ключевое слово volatile здесь, по всей вероятности, не имеет значения (недоразумение от предыдущего разработчика), но не может легко избавиться от него (из другой библиотеки).

cannot convert argument N from 'volatile const char *' to 'std::string

Я мог бы просто использовать const_cast отбрасывать volatile (и компилятор игнорирует volatile / const). Меня интересует решение, не использующее const_cast.

Существуют ли другие методы, например. Может ли использование stringstream возможно быть решением?

Ответы [ 2 ]

1 голос
/ 11 ноября 2019

Просто используйте цикл for, может быть опция:

volatile const char* cstr = "hello world";
std::string str;
for (volatile const char* pC = *cstr ; *pC != 0; ++pC) {
    str.push_back(*pC);
}
1 голос
/ 11 ноября 2019

Вы можете использовать алгоритм 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() по той же причине - если у вас нетразмер, вам нужно написать свой цикл для его расчета.

...