首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >文字charT数组

文字charT数组
EN

Stack Overflow用户
提问于 2016-01-20 14:24:48
回答 1查看 150关注 0票数 2

我正在研究一些涉及文本的算法API。

我希望它不依赖于字符类型(charwchar_t.),因此我使用模板参数CharT创建了模板类。这些类使用std::basic_string<CharT>

我必须用默认值初始化很多basic_string。如果CharTchar,我可以影响字面"default_text",或者如果CharT是wchar_t,我可以影响L"default_text",但这不是泛型的(它是CharT依赖的)。

您考虑过用泛型方法初始化basic_string吗?

如果这可能有用的话,我的代码在C++11中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-20 15:36:54

因为您的代码是泛型的,所以我猜您的文字只包含ASCII字符。否则,你将不得不在飞行中转码,这将是很多麻烦。为了将类型为char[]的纯ASCII字符串文字提升到另一种字符类型,您可以简单地单独提升每个字符。

如果您无论如何都要初始化一个std::basic_string,那么您也可以立即完成它。下面的函数接受char[]字符串文本和目标类型,并将其提升为该类型的字符串。

代码语言:javascript
复制
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;
}

它可以像这样使用。

代码语言:javascript
复制
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操作。你可以随心所欲地花哨,但我会在这里保持简单。

代码语言:javascript
复制
template <typename T, std::size_t N>
struct array { T data[N]; };

接下来,我们还需要一个constexpr版本的std::strlen

代码语言:javascript
复制
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函数来提升字符串文本。

代码语言:javascript
复制
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;
}

将其封装到宏中可能比较方便。对此我很抱歉。

代码语言:javascript
复制
#define AS_ARRAY(Type, Text) as_array<Type, cstrlen(Text)>(Text).data

它可以像这样使用。

代码语言:javascript
复制
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';
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34902655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档