我正在将字段类读取函数转换为一个模板函数。我有 int、unsigned int、long
和 unsigned 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
, 以及所有不区分大小写的组合
以下是问题:
- C++ 标准说的是
用于提取
bool
的有效数据,
使用流提取
操作员?
- 由于布尔值可以表示为
text,这是否涉及
locale
?
- 这个平台依赖吗?
我想通过不为 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:
- What does the C++ standard say are
valid data to extract a bool
,
using the stream extraction
operator?
- Since Boolean can be represented by
text, does this involve locale
s?
- 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.
发布评论
评论(1)
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()
andstd::numpunct::falsename()
. You can get thenumpunct
for a given stream withuse_facet <numpunct <char> >(stream.getloc())
, if I understand the documentation correctly.EDIT: You can toggle whether to use
"1"
/"0"
or"true"
/"false
withstd::noboolalpha
andstd::boolalpha
.