我在 C++ 中有一个模板类,它作为 char_type
模板参数字符类型,例如char
, wchar_t
, char32_t
, 等等... 该类然后使用 std::basic_string<char_type>
在代码中。
然后在类里面的某个地方,我填写了一个转义序列表,例如 "&"
.这不起作用,因为取决于模板字符类型,我们需要使用 "&"
, L"&"
, U"&"
...
有没有办法避免专门用于初始化表的模板函数,例如使用一些标准函数来转换字符串文字?
由于这些是转义序列,因此除了 ASCII 字符外,它们不包含任何其他字符。
最佳答案
我会做以下事情:
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
}
你可以这样使用它:
// Table of escaping sequences
std::basic_string<char_type> escaping_sequences[] =
{
literal<char_type>("&"),
literal<char_type>("&foo"),
literal<char_type>("&bar"),
...
}
我测试过了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> >
尚未针对所有字符类型进行测试,但希望对您有所帮助。
编辑 1
糟糕,我刚刚注意到 galinette在我做之前几乎回答了和我一样的问题。我的代码和 galinette 的代码之间的唯一区别是我使用 reserve
分配结果字符串一次,而不是使用 push_back
的自动分配。 del> 在编译时计算字符数,因为使用了 LENGTH
作为模板参数。
编辑2
可以通过将 end
迭代器减 1 来避免最后的空字符问题:
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
}
或者,使用 std::copy_n
而不是 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
}
关于c++ - 在 "char type"模板类中使用字符串文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32840368/