- 235 名前:232 mailto:sage [2009/09/30(水) 18:42:37 ]
- >>234
ありがとうございます。 もともと uint を先に持ってきたのは、大きな整数を入力すると、double の精度を 超えた値が丸められてしまうのを防ぎたかったんです。 コードを書き直しました。 bool is_real_value; double real_value; unsigned __int64 uint_value; void IntAction(unsigned __int64 v) { is_real_value = false; uint_value = v; } void RealAction(double v) { is_real_value = true; real_value = v; } int main() { rule<> expr = (uint_parser<unsigned __int64>()[&IntAction] | real_p[&RealAction]); parse_info<> pi; pi = parse("1.0", expr); ASSERT(pi.full); ASSERT(is_real_value); ASSERT(real_value == 1.0); pi = parse("12345678901234567890", expr); ASSERT(pi.full); ASSERT(!is_real_value); ASSERT(uint_value == 12345678901234567890); pi = parse("123", expr); ASSERT(pi.full); ASSERT(!is_real_value); ASSERT(uint_value == 123); } このコードのままだと、"1.0" の解釈で失敗し、uint_p と real_p を逆にすると、すべて real として処理されてしまい、ASSERTで止まりまくります。何がおかしいんでしょうか。
|

|