Opened 12 years ago

Closed 12 years ago

Last modified 12 years ago

#4496 closed Bugs (fixed)

xpressive::as<int>(_) does not work with wchar_t

Reported by: anonymous Owned by: Eric Niebler
Milestone: Boost 1.44.0 Component: xpressive
Version: Boost 1.44.0 Severity: Problem
Keywords: xpressive regex_actions Cc:

Description

  using namespace boost::xpressive;

  std::wstring version(L"0.9.500");

  int maj1(0), min1(0), build1(0);

  wsregex re1 = (+_d)[ref(maj1) = as<int>(_)] >> L"." >>
                (+_d)[ref(min1) = as<int>(_)] >> L"." >>
                (+_d)[ref(build1) = as<int>(_)];

  bool v1 = regex_match(version, re1);

  std::wcout << maj1 << std::endl;    // 48      must be 0
  std::wcout << min1 << std::endl;    // 57      must be 9
  std::wcout << build1 << std::endl;  // 534848  must be 500

The cause is

        template<typename T>
        struct as
        {
            typedef T result_type;

            template<typename Value>
            T operator()(Value const &val) const
            {
                return lexical_cast<T>(val);
            }
        };

val is sub_match type (this case)

lexical_cast<T> uses stream_char<T> to define the widest char while there is no spec for stream_char<xpressive::sub_match> so lexical_cast uses char as char_type

Change History (4)

comment:1 by anonymous, 12 years ago

MS VC2008

comment:2 by Eric Niebler, 12 years ago

Status: newassigned

comment:3 by Eric Niebler, 12 years ago

Resolution: fixed
Status: assignedclosed

(In [65788]) as() handles wide sub_match objects correctly, fixes #4496

comment:4 by Eric Niebler, 12 years ago

(In [65866]) Merged revisions 65788 via svnmerge from https://svn.boost.org/svn/boost/trunk

........

r65788 | eric_niebler | 2010-10-06 12:02:04 -0700 (Wed, 06 Oct 2010) | 1 line

as() handles wide sub_match objects correctly, fixes #4496

........

Note: See TracTickets for help on using tickets.