Re: std::string in C-style in interface
 
On Sep 9, 11:49 pm, Seungbeom Kim <musip...@bawi.org> wrote:
On 2010-09-08 23:53, Kai Wen wrote:
On 2010-09-09, SG <s.gesem...@gmail.com> wrote:
  vector<char> temp;
  temp.reserve(thestring.size()+1);
  temp.assign(thestring.begin(),thestring.end());
  temp.push_back('\0');
  foo(&temp[0]);
  thestring = &temp[0];
But I think this method is too complex. :-(
Maybe the four lines before calling foo can be shortened to two:
    const char *b = thestring.c_str(), *e = b + thestring.size() + 1;
    vector<char> temp(b, e);
Or even to:
    std::vector<char> temp(thestring.begin(), thestring.end());
Similarly, the last line could just as easily be:
    thestring.assign(temp.begin(), temp.end());
The best solution depends on context, however.  If the legacy
function is actually returning a string value in the buffer (and
doesn't use the initial contents), something like the following
may be appropriate:
    std::string
    getCurrentWorkingDirectory()
    {
        std::vector<char> results( 1000 );
        errno = 0;
        while ( getcwd(&results[0], results.size() ) == NULL
                && errno == ERANGE) {
            results.resize( 2 * results.size() );
            errno = 0;
        }
        if ( errno != 0 )
            throw SomeError();
        return std::string( results.begin(), results.end() );
    }
(I've used the Posix function getcwd as an example, but of
course there are tons of functions for which this would be
appropriate, but under Posix and under Windows.)
--
James Kanze