文字字符数组
literal charT array
我正在研究一些涉及文本的算法的API。
我想让它不依赖于字符类型(char
,wchar_t
...),所以我用模板参数 CharT 制作了模板类。这些类使用 std::basic_string<CharT>
.
我必须使用默认值初始化很多basic_string。如果CharT
char
我可以影响字面上的"default_text",或者如果 CharT wchar_t
我可以影响 L"default_text",但这不是通用的(它是CharT
依赖的)。
您是否想到了使用泛型方法初始化basic_string的方法?
如果这可能有帮助,我的代码是C++11
.
由于您的代码是通用的,因此我猜您拥有的文字仅包含 ASCII 字符。否则,您将不得不即时对其进行转码,这将很麻烦。为了将类型 char[]
的纯 ASCII 字符串文本提升为另一种字符类型,只需单独升级每个字符即可。
如果您无论如何都要初始化std::basic_string
,您也可以立即执行此操作。 以下函数采用char[]
字符串文本和目标类型,并将其提升为该类型的字符串。
template <typename CharT>
auto
as_string(const char *const text)
{
const auto length = std::strlen(text);
auto string = std::basic_string<CharT> {};
string.resize(length);
for (auto i = std::size_t {}; i < length; ++i)
string[i] = CharT {text[i]};
return string;
}
它可以像这样使用。
std::cout << as_string<char>("The bats are in the belfry") << 'n';
std::wcout << as_string<wchar_t>("The dew is on the moor") << L'n';
但是您要求的是字符数组,而不是std::basic_string
。在C++14中,constexpr
可以在这方面提供很多帮助。 请注意,您需要最新的编译器才能很好地支持此功能。
我们要做的第一件事是滚动我们自己的std::array
版本,提供constexpr
操作。 你可以随心所欲地花哨,但我会在这里保持简单。
template <typename T, std::size_t N>
struct array { T data[N]; };
接下来,我们还需要一个constexpr
版本的std::strlen
。
template <typename CharT>
constexpr auto
cstrlen(const CharT *const text) noexcept
{
auto length = std::size_t {};
for (auto s = text; *s != CharT {0}; ++s)
++length;
return length;
}
现在我们可以编写一个 constexpr
函数来提升我们的字符串文字。
template <typename CharT, std::size_t Length>
constexpr auto
as_array(const char *const text)
{
auto characters = array<CharT, Length + 1> {};
if (cstrlen(text) != Length)
throw std::invalid_argument {"Don't lie about the length!"};
for (auto i = std::size_t {}; i < Length; ++i)
characters.data[i] = text[i];
characters.data[Length] = CharT {0};
return characters;
}
将其包装到宏中可能很方便。 对此我很抱歉。
#define AS_ARRAY(Type, Text) as_array<Type, cstrlen(Text)>(Text).data
它可以像这样使用。
std::cout << AS_ARRAY(char, "The bats are in the belfry") << 'n';
std::wcout << AS_ARRAY(wchar_t, "The dew is on the moor") << L'n';
- 指向指向字符数组的指针数组的指针
- 比较字符数组
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 使用无符号字符数组有效存储内存
- 按字符值访问int数组
- 错误:字符数组的初始值设定项太多
- 对字符数组中的元素执行逐位操作
- C++,在int数组中输入字符串或字符会输出0,而不是ascii或error
- C++ 无法在字符数组中使用 for 循环打印字母模式
- 如何在 C++ 中从文件中读取字符数组(带有一些空格)
- 移动二维数组中的字符
- C++ 传递二维字符数组
- 无法在 C++ 中输入字符数组
- C++ 带结构的数组字符
- 数组字符包含量超出预期
- 读取文件并添加到数组字符
- 如何在Qt中更改或替换数组字符
- 为什么编译器不在参数中传递数组字符 *arr[] 的大小?
- 井字棋数组字符错误
- 分割数组字符