在模板化函数中从 istream 中提取 bool

发布于 2024-09-02 16:15:11 字数 836 浏览 7 评论 0 原文

我正在将字段类读取函数转换为一个模板函数。我有 int、unsigned int、longunsigned long 的字段类。这些都使用相同的方法从 istringstream 中提取值(仅类型发生变化):

template <typename Value_Type>
Value_Type Extract_Value(const std::string& input_string)
{
    std::istringstream    m_string_stream;
    m_string_stream.str(input_string);
    m_string_stream.clear();
    m_string_stream >> value;
    return;
}

棘手的部分是 bool (布尔)类型。布尔值有多种文本表示形式:
0, 1, T, F, TRUE, FALSE, 以及所有不区分大小写的组合

以下是问题:

  1. C++ 标准说的是 用于提取 bool 的有效数据, 使用流提取 操作员?
  2. 由于布尔值可以表示为 text,这是否涉及locale
  3. 这个平台依赖吗?

我想通过不为 bool 输入编写自己的处理程序来简化我的代码。

我使用的是 MS Visual Studio 2008(版本 9)、C++、Windows XP 和 Vista。

I'm converting my fields class read functions into one template function. I have field classes for int, unsigned int, long, and unsigned long. These all use the same method for extracting a value from an istringstream (only the types change):

template <typename Value_Type>
Value_Type Extract_Value(const std::string& input_string)
{
    std::istringstream    m_string_stream;
    m_string_stream.str(input_string);
    m_string_stream.clear();
    m_string_stream >> value;
    return;
}

The tricky part is with the bool (Boolean) type. There are many textual representations for Boolean:
0, 1, T, F, TRUE, FALSE, and all the case insensitive combinations

Here's the questions:

  1. What does the C++ standard say are
    valid data to extract a bool,
    using the stream extraction
    operator?
  2. Since Boolean can be represented by
    text, does this involve locales?
  3. Is this platform dependent?

I would like to simplify my code by not writing my own handler for bool input.

I am using MS Visual Studio 2008 (version 9), C++, and Windows XP and Vista.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

暗喜 2024-09-09 16:15:11

true 和 false 的字符串由 std::numpunct::truename()std::numpunct::falsename() 定义。您可以使用 use_facet 获取给定流的 numpunct >(stream.getloc()),如果我正确理解文档的话。

编辑:您可以切换是否使用 "1"/"0""true"/"false与 std::noboolalpha 和 std::boolalpha 。

The strings for true and false are defined by std::numpunct::truename() and std::numpunct::falsename(). You can get the numpunct for a given stream with use_facet <numpunct <char> >(stream.getloc()), if I understand the documentation correctly.

EDIT: You can toggle whether to use "1"/"0" or "true"/"false with std::noboolalpha and std::boolalpha.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文