$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Oleg Abrosimov (olegabr_at_[hidden])
Date: 2007-05-12 22:34:29
Beman Dawes wrote:
> The C++ committee accepted what is essentially Boost.System for C++0x. 
> See http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2241.html 
> for the final proposal.
Looks nice. With one issue:
This document has following wording:
virtual string message(error_code::value_type ev) const=0;
     Returns: A string that describes the error condition denoted by ev.
     [Note: The intent is to return a locale sensitive string that 
describes the error corresponding to ev.  --end note.]
     Throws: Nothing.
virtual wstring wmessage(error_code::value_type ev) const=0;
     Returns: A string that describes the error condition denoted by ev.
     [Note: The intent is to return a locale sensitive string that 
describes the error corresponding to ev.  --end note.]
     Throws: Nothing.
[snip]
   class error_code
   {
   public:
     // snipped code
     string                 message() const;
     wstring                wmessage() const;
     // snipped code
   };
locale sensitivity is good, but in this form user is enforced to 
set/unset global locale each time he wants to use locale sensitive 
output from error_category like this:
std::locale oldLocale = std::locale::global(myLocale);
std::cout << err_cat.message(ev);
std::locale::global(oldLocale);
It is tedious, requires additional work to make it exception safe and 
thread safe.
I propose to change wording to the following:
virtual string message(error_code::value_type ev, std::locale loc = 
std::locale()) const=0;
     Returns: A string that describes the error condition denoted by ev.
     [Note: The intent is to return a locale sensitive string that 
describes the error corresponding to ev.  --end note.]
     Throws: Nothing.
virtual wstring wmessage(error_code::value_type ev, std::locale loc = 
std::locale()) const=0;
     Returns: A string that describes the error condition denoted by ev.
     [Note: The intent is to return a locale sensitive string that 
describes the error corresponding to ev.  --end note.]
     Throws: Nothing.
[snip]
   class error_code
   {
   public:
     // snipped code
     string message(std::locale loc = std::locale()) const;
     wstring wmessage(std::locale loc = std::locale()) const;
     // snipped code
   };
Then user code would be as simple as:
std::cout << err_cat.message(ev, myLocale);
global state is not touched here, so no problems with exception and 
thread safety (I don't take cout into account here)
Oleg Abrosimov.