I would do the following:
template <typename char_type, size_t LENGTH>
constexpr std::basic_string<char_type> literal(const char (&value)[LENGTH])
{
using string = std::basic_string<char_type>;
string result{};
result.reserve(LENGTH);
std::copy(std::begin(value), std::end(value), std::back_inserter(result));
return result; // rvo
}
You can use it this way:
// Table of escaping sequences
std::basic_string<char_type> escaping_sequences[] =
{
literal<char_type>("&"),
literal<char_type>("&foo"),
literal<char_type>("&bar"),
...
}
I've tested it in Ideone:
literal< char >("test") // result: std::string
literal<char32_t>("test") // result: std::basic_string<char32_t, std::char_traits<char32_t>, std::allocator<char32_t> >
literal<char16_t>("test") // result: std::basic_string<char16_t, std::char_traits<char16_t>, std::allocator<char16_t> >
Is untested for all the char types but hope it helps.
Edit 1
My bad, I just noticed that galinette almost answered the same as me before I did. The only difference between my code and the one from galinette is that I'm allocating the resulting string once with reserve
instead of using the automatic allocation of push_back
counting the number of characters at compile time, due to the use of LENGTH
as a template parameter.
Edit 2
It is possible to avoid the final null character issue by substracting 1 to the end
iterator:
template <typename char_type, size_t LENGTH>
constexpr std::basic_string<char_type> literal(const char (&value)[LENGTH])
{
using string = std::basic_string<char_type>;
string result{};
result.reserve(LENGTH - 1);
std::copy(std::begin(value), std::end(value) - 1, std::back_inserter(result));
return result; // rvo
}
Or, using std::copy_n
instead of std::copy
:
template <typename char_type, size_t LENGTH>
constexpr std::basic_string<char_type> literal(const char (&value)[LENGTH])
{
using string = std::basic_string<char_type>;
string result{};
result.reserve(LENGTH - 1);
std::copy_n(std::begin(value), LENGTH - 1, std::back_inserter(result));
return result; // rvo
}
u8"A"
and"A"
are indistinguishable by type, but not necessarily the same value? Before this can be done you need to think properly about your requirements. (A
is merely an example, picked for familiarity. There are maybe about one hundred other examples) – Victorie"A"
will not be the same asu8"A"
are indifferent to the source code encoding (see, e.g., GCC's-fexec-charset
flag). – Victorie