c++ - How to cleanly use: const char* and std::string? -


tl:dr

how can concatenate const char* std::string, neatly , elegantly, without multiple function calls. ideally in 1 function call , have output const char*. impossible, optimum solution?

initial problem

the biggest barrier have experienced c++ far how handles strings. in opinion, of used languages, handles strings poorly. i've seen other questions similar either have answer saying "use std::string" or point out 1 of options going best situation.

however useless advice when trying use strings dynamically how used in other languages. cannot guaranty able use std::string , times when have use const char* hit obvious wall of "it's constant, can't concatenate it".

every solution string manipulation problem i've seen in c++ requires repetitive multiple lines of code work format of string. want able concatenate set of characters + symbol or make use of simple format() function how can in c# or python. why there no easy option?

current situation

standard output

i'm writing dll , far i've been output text cout via << operator. has been going fine far using simple char arrays in form:

cout << "hello world!" 

runtime strings

now comes point want construct string @ runtime , store class, class hold string reports on errors can picked other classes , maybe sent cout later, string set function setreport(const char* report). don't want use more 1 line go ahead , write like:

setreport("failure in " + __function__ + ": foobar " + foobar + "\n"); // __function__ gets name of current function, foobar variable 

immediately of course get:

  • expression must have integral or unscoped enum type and...
  • '+': cannot add 2 pointers

ugly strings

right. i'm trying add 2 or more const char*s , isn't option. find main suggestion here use std::string, sort of weird typing "hello world!" doesn't give 1 of in first place let's give go:

setreport(std::string("failure in ") + std::string(__function__) + std::string(": foobar ") + std::to_string(foobar) + std::string("\n")); 

brilliant! works! how ugly is!! that's of ugliest code i've every seen. can simplify this:

setreport(std::string("failure in ") + __function__ + ": foobar " + std::to_string(foobar) + "\n"); 

still possibly worst way i've every encounter of getting simple 1 line string concatenation should fine right?

convert constant

well no, if you're working on dll, tend lot because unit test need c++ code imported unit test library, find when try set report string member variable of class std::string compiler throws warning saying:

warning c4251: class 'std::basic_string<_elem,_traits,_alloc>' needs have dll-interface used clients of class' 

the real solution problem i've found other "ignore warning"(bad practice!) use const char* member variable rather std::string not solution, because have convert ugly concatenated (but dynamic) string const char array need. can't tag .c_str() on end (even though why want because concatenation becoming more ridiculous second?) have make sure std::string doesn't clean newly constructed string , leave garbage. have inside function receives string:

const std::string conststring = (input); m_constchar = conststring.c_str(); 

which insane. because traipsed across several different types of string, made code ugly, added more lines should need , stick characters together. why hard?

solution?

so what's solution? feel should able make function concatenates const char*s handle other object types such std::string, int or double, feel should capable in 1 line, , yet i'm unable find examples of being achieved. should working char* rather constant variant, though i've read should never change value of char* how help?

are there experienced c++ programmers have resolved issue , comfortable c++ strings, solution? there no solution? impossible?

one of simplest solution use c++ empty string. here declare empty string variable named _ , used in front of string concatenation. make sure put in front.

#include <cstdio> #include <string>  using namespace std; string _ = "";  int main() {         char s[] = "chararray";         string result =                 _ + "function name = [" + __function__ + "] "                 "and s [" + s + "]\n";         printf( "%s", result.c_str() );         return 0; } 

output:

function name = [main] , s [chararray] 

regarding __function__, found in visual c++ macro while in gcc variable, setreport("failure in " __function__ "; foobar " + foobar + "\n"); work on visual c++. see: https://msdn.microsoft.com/en-us/library/b0084kay.aspx , https://gcc.gnu.org/onlinedocs/gcc/function-names.html

the solution using empty string variable above should work on both visual c++ , gcc.


Comments

Popular posts from this blog

php - failed to open stream: HTTP request failed! HTTP/1.0 400 Bad Request -

java - How to filter a backspace keyboard input -

java - Show Soft Keyboard when EditText Appears -