|
Boost : |
Subject: Re: [boost] [C++0x] Emulate C++0x char16_t, char32_t, std::u16string, and std::u32string
From: Artyom Beilis (artyomtnk_at_[hidden])
Date: 2011-07-21 01:54:16
--- On Thu, 7/21/11, Beman Dawes <bdawes_at_[hidden]> wrote:
> From: Beman Dawes <bdawes_at_[hidden]>
> > You can't create working
> >
> > std::basic_ostringstream<char16_t> stream;
> >
> > Because stream << 1245 would not work due to
> lack of std::locale facets.
> >
> > You can't create requires facets as for example they
> are specialized
> > in many standard libraries.
>
> Emulation via simple uint16_t and uint32_t typedefs doesn't
> work for
> all use cases. So only use it when it does work.
>
And Boost.Filesystem.v3 is one of these specific use cases.
Boost.Filesystem uses codecvt facet? You can't create them, at
least with gcc/linux because existing codecvt facets are specialized
for each type of character - and you have to derive from it.
For example this code would not link with Linux/gcc-4.6
#include <locale>
class real_facet :
public std::codecvt<char16_t,char,std::mbstate_t>
{
};
class simulated_facet :
public std::codecvt<unsigned short,char,std::mbstate_t>
{
};
int main()
{
std::locale l1(std::locale::classic(),new real_facet());
std::locale l2(std::locale::classic(),new simulated_facet());
}
With errors like:
undefined reference to `std::codecvt<char16_t, char, __mbstate_t>::do_in(__mbstate_t&, char const*, char const*, char const*&, char16_t*, char16_t*, char16_t*&) const'
--- : undefined reference to `std::codecvt<unsigned short, char, __mbstate_t>::do_max_length() const' > > Even existing Microsoft's VC2010 does not work if you > compile application > > with /MD or /MDd > > I'll retest just to be sure, but I'm fairly sure that some > of my tests > have used those switches. > MSVC2010 does not provide specialization for std::locale::id for these new facets and they are undefined in the dll. If you want I'll provide a fault case for MSVC10 as well. And all these with compilers that **declare** support of charXX_t. So you may try to put an effort in implementing some emulation but at these points char16_t/char32_t are broken with modern compilers. Artyom Beilis -------------- CppCMS - C++ Web Framework: http://cppcms.sf.net/ CppDB - C++ SQL Connectivity: http://cppcms.sf.net/sql/cppdb/
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk