From: <rhy...@gm...> - 2007-07-18 08:13:14
|
Hi, Glyn I am recently working on a binary protocol oriented network framework based on ASIO in my project. So I do care more about a binary protocol oriented message type. so I have once asked Dean a question during a private communication: What's the granularity of the Tag template parameter of basic_message<> template? One tag per message type (I means text/binary here) or one tag per protocol? And Dean replied: The Tag template parameter is meant to differentiate the message types -- for easy extension. That means, to be clear, the message tags I envision are: tags::unicode tags::text (tags::default_) tags::binary tags::stream tags::serializable_text tags::serializable_binary tags::serializable_xml Among many others I haven't thought of yet. :D They are tags, because I don't intend to put the overhead of an abstract message class as the base class for all the message types. That allows us to implement a basic_message<tags::text> and basic_message<tags::binary>, and specialize the implementations without having to rely on inheritance and runtime polymorphism. As Dean stated, with such tags, we can specialize different message types. And I think the message type tags should imply the underlying storage policy of that type of basic_message. Say, tags::text (tags::default_) implies an std::string storage facility, while tags::unicode implies an std::wstring storage facility, and tags::stream may implies a boost::asio::streambuf storage facility (as what I've done in my own project). So I suggest we could include a storage_type in the tags struct: struct tags { struct default_ { typedef std::string storage_type; }; typedef default_::text; struct unicode { typedef std::wstring storage_type; }; struct stream { typedef boost::asio::streambuf storage_type; }; ... }; typedef basic_message<tags::text> message; typedef basic_message<tags::unicode> wmessage; typedef basic_message<tags::stream> smessage; ... Would this be sane? Cheers Cheng Glyn Matthews wrote: > Guys, > > I've been giving a little thought to something Dean mentioned in his > last message about using std::string in the network library. > > The first thing I thought of was that Dean stated that "everything is > a template". Apart of course from std::string. I have created a > branch in SVN named gxm) which replaces all references to std::string > with an extra template parameter. Happily, this passes all the > original tests (with an additional template specialization so that > const char * is converted to a std::string). However, this creates a > problem (certainly with GCC) because the wchar_t typedef is the same > as char and its not possible to overload const wchar_t * in the same > way. So the following code will not compile: > > wmessage wmsg; > wmsg << header(L"wide characters"); > > Another thing I see is that boost filesystem and boost program_options > have dealt with a very similar problem to this. But if we use the > same approach (see the file "boost/detail/utf8_codecvt_facet.hpp" ) > then we'd have to accept the use of a cpp source file, meaning we will > no longer have a header only library. > > What do others think about this? > > G > > ------------------------------------------------------------------------ > > ------------------------------------------------------------------------- > This SF.net email is sponsored by DB2 Express > Download DB2 Express C - the FREE version of DB2 express and take > control of your XML. No limits. Just data. Click to get it now. > http://sourceforge.net/powerbar/db2/ > ------------------------------------------------------------------------ > > _______________________________________________ > Cpp-netlib-devel mailing list > Cpp...@li... > https://lists.sourceforge.net/lists/listinfo/cpp-netlib-devel > |