Don't use std::wstring EVER. The std::wstring has a platform dependent storage class. This means on Windows it is 32bits and Linux it is 16bits. None of the std::string types, and there are more than std::wstring, define an encoding, so would the wstring be UTF-16, UC-2, UTF-32, UC-4, or some other local non-unicode codepage. It gets nasty fast!
If you only support std::string and require the all std::string's be encoded with UTF-8 then things get real clear really fast. Yes there is some overhead in converting to UC-4 for calling windows system calls that want Unicode 32-bit std::wstring but we already had that overhead since almost all strings in NC were actually 8-bit UTF-8 std::string. And since almost all those are ASCII strings and UTF-8 can encode ASCII without overhead we are good to go! So to simply we would change Serializable::toString to only a std::string. class Serializable { ... virtual const std::string& toString() const noexcept; } So the example use would be: auto myObject = region.get("myObject"); // auto = std::shared_ptr<MyObject> auto myString = myObject->toString(); // auto = std::string std::cout << myString; Even nicer may be to implement a default << operator for Serializable the outputs the toString so we can do: std::cout << region.get("myObject"); As for exporting a to_string into the std namespace, I think that is one that is actually forbidden unlike std::hash/equal_to. I feel like I found that when trying to output std::chrono::duration objects to stream. Can you double check that it is allowed? -Jake On Thu, Sep 14, 2017 at 11:30 AM David Kimura <dkim...@pivotal.io> wrote: > Seems like a good idea. > > Here's a quick thought - I think c++11 is not really an obj.toString() kind > of language (like Java or C#). Would it make sense to add std::to_string() > and std::to_wstring() equivalents for CacheableString? This might mean > implementing following functions: > > std::string to_string(CacheableString value); > std::wstring to_wstring(CacheableString value); > > So that we can do something like: > > std::cout << std::to_wstring(pdxser); > > Thanks, > David > > On Thu, Sep 14, 2017 at 11:10 AM, Michael William Dodge <mdo...@pivotal.io > > > wrote: > > > +1 for std::string and std::wstring. > > > > Sarge > > > > > On 14 Sep, 2017, at 11:10, Mark Hanson <mhan...@pivotal.io> wrote: > > > > > > Hi All, > > > > > > I wanted to broach the subject of moving away from moving away from > > CacheableStringPtrs for the toString representation of Serializable. It > > would seem desirable to move to std::string and std::wstring to use more > > basic types that would be faster to log and the code would be simpler > for a > > user. > > > > > > Are there any opinions on this subject? > > > > > > Here is a before and after look at a chunk of code > > > > > > Before > > > > > > CacheableStringPtr ptr = pdxser->toString(); > > > if (ptr->isWideString()) { > > > printf(" query idx %d pulled object %S :: \n", i, > > > ptr->asWChar()); > > > } else { > > > printf(" query idx %d pulled object %s :: \n", i, > > > ptr->asChar()); > > > } > > > > > > After > > > > > > > > > if (pdxser->isWideString()) { > > > std::cout << " query idx “ << i << "pulled object ” << > > pdxser->toWString() << std::endl; > > > } else { > > > std::cout << " query idx “ << i << "pulled object ” << > > pdxser->toString() << std::endl; > > > } > > > > > > > > > Thanks, > > > Mark > > > > >