Note that I am still resisting the idea of .str() as a member function. If the joiner or concatenation object exports begin() and end(), it's un-necessary, because the object returned by create_string() (or similar) can use the iterators.
I like that idea, though I still don't like the name to_string().
How about this:
auto s = generatestd::sting(concat(...)); auto ws = generatestd::wsting(concat(...));
Why don't you add explicit conversion operators to the string factory explicit operator std::string() { … } explicit operator std::wstring() { … } explicit type conversion was exactly added for this situation in C++11. The call is then auto s = static_caststd::string(concat(…)); etc. Otherwise I don't care if you add .str() or .to_string() members. I would prefer writing auto s = concat(…).str(); over auto s = static_caststd::string(concat(…)); But both should be supported.