[serialization] broken in 1.36
Dear all, yesterday we upgraded to vstudio 2008 and Boost 1.36. However it seems that the serialization library gives a STATIC_WARNING now. the code uses a shared_ptr of a data structure which has no virtual function. This was ok in Boost 1.34 and I don't see why this should be wrong: #include "stdafx.h" #include <sstream> #include <boost\shared_ptr.hpp> #include <boost\serialization\shared_ptr.hpp> #include <boost\serialization\nvp.hpp> #include <boost\archive\xml_iarchive.hpp> struct Data { std::string m_str; }; template <class Archive> void serialize(Archive& ar, Data& r, const unsigned int /*version*/) { ar & BOOST_SERIALIZATION_NVP(r.m_str); } struct DataStorage { template <class Archive> void serialize(Archive& ar, const unsigned int /*version*/) { ar & BOOST_SERIALIZATION_NVP(m_ptrBla); } private: //data typedef boost::shared_ptr<Data> DataPtr; DataPtr m_ptrBla; }; int _tmain() { DataStorage data; std::stringstream sstr; //boost::archive::xml_oarchive oa(sstr); //oa << boost::serialization::make_nvp("bla", data); boost::archive::xml_iarchive ia(sstr); ia >> boost::serialization::make_nvp("bla", data); return 0; } It gives warning c4099 where '<---': const extended_type_info * get_derived_extended_type_info(const T & t) const { // note: this implementation - based on usage of typeid (rtti) // only does something if the class has at least one virtual function. BOOST_STATIC_WARNING(boost::is_polymorphic<T>::value); //<--- return detail::extended_type_info_typeid_0::get_extended_type_info( typeid(t) );
Hi, I've got some code which needs to call a template function on different objects (potentially in a for loop). I'm currently doing this using an array of function ptrs but like the idea of an array of types. template<class T> bool func( std::string& id ) { return T::dothing( id ); } int main() { const int countOfTypes = 3; boost::function< bool (std::string& )> funcs[countOfTypes] = { boost::bind( func<Obj1>, _1 ), boost::bind( func<Obj2>, _1 ), boost::bind( func<Obj3>, _1 ) }; for( int i = 0; i < countOfTypes; ++i ) { funcs[i]( "testid" ); //would prefer //func<objTypeArray[i]>( "testid" ); } } I believe this should be possible using the pre-processor or meta programming parts of boost but have no experience of either and was hoping for some pointers. Is it possible and is it, IYO, better than the function pointer method I'm currently using? Thanks in advance, Patrick ****************************************************************************** "This message and any attachments are solely for the intended recipient and may contain confidential and privileged information. If you are not the intended recipient, any disclosure, copying, use, or distribution of the information included in this message and any attachments is prohibited. If you have received this communication in error, please notify us by reply e-mail and immediately and permanently delete this message and any attachments. Thank you." Interactive Transaction Solutions Ltd (2473364 England) Registered Office: Systems House, Station Approach Emsworth PO10 7PW ********************************************************************** Ce message �lectronique contient des informations confidentielles � l'usage unique des destinataires indiqu�s, personnes physiques ou morales. Si vous n'�tes pas le destinataire voulu, toute divulgation, copie, ou diffusion ou toute autre utilisation de ces informations, est interdite. Si vous avez re�u ce message �lectronique par erreur, nous vous remercions d'en avertir son exp�diteur imm�diatement par email et de d�truire ce message ainsi que les �l�ments attach�s. Interactive transaction Solutions SAS- France (RCS Pontoise : 489 397 877) Si�ge social : Parc Saint Christophe, 10, Avenue de l�Entreprise 95865 Cergy-Pontoise Cedex ______________________________________________________________________ This email has been scanned by the MessageLabs Email Security System. For more information please visit http://www.messagelabs.com/email ______________________________________________________________________
AMDG Patrick Loney wrote:
I've got some code which needs to call a template function on different objects (potentially in a for loop). I'm currently doing this using an array of function ptrs but like the idea of an array of types. <snip>
I believe this should be possible using the pre-processor or meta programming parts of boost but have no experience of either and was hoping for some pointers. Is it possible and is it, IYO, better than the function pointer method I'm currently using?
boost::mpl::for_each does what you want http://www.boost.org/doc/libs/1_36_0/libs/mpl/doc/refmanual/for-each.html (untested): template<class T> struct wrap {}; struct func_f { typedef void result_type; template<class T> void operator()(const wrap<T>&, const std:;string& s) const { func<T>(s); } }; int main() { boost::mpl::for_each<boost::mpl::vector<Obj1, Obj2, Obj3>, wrap<boost::mpl::_1> >( boost::bind(func_f(), _1, "testid")); } In Christ, Steven Watanabe
Hmm - it would be wrong if DataPtr was the base class part of derived class pointer. Perhaps the warning is over-zealous - would have to think about this. Robert Ramey gast128 wrote:
Dear all,
yesterday we upgraded to vstudio 2008 and Boost 1.36. However it seems that the serialization library gives a STATIC_WARNING now. the code uses a shared_ptr of a data structure which has no virtual function. This was ok in Boost 1.34 and I don't see why this should be wrong:
#include "stdafx.h" #include <sstream> #include <boost\shared_ptr.hpp> #include <boost\serialization\shared_ptr.hpp> #include <boost\serialization\nvp.hpp> #include <boost\archive\xml_iarchive.hpp>
struct Data { std::string m_str; };
template <class Archive> void serialize(Archive& ar, Data& r, const unsigned int /*version*/) { ar & BOOST_SERIALIZATION_NVP(r.m_str); }
struct DataStorage { template <class Archive> void serialize(Archive& ar, const unsigned int /*version*/) { ar & BOOST_SERIALIZATION_NVP(m_ptrBla); }
private: //data typedef boost::shared_ptr<Data> DataPtr;
DataPtr m_ptrBla; };
int _tmain() { DataStorage data; std::stringstream sstr;
//boost::archive::xml_oarchive oa(sstr); //oa << boost::serialization::make_nvp("bla", data);
boost::archive::xml_iarchive ia(sstr); ia >> boost::serialization::make_nvp("bla", data);
return 0; }
It gives warning c4099 where '<---':
const extended_type_info * get_derived_extended_type_info(const T & t) const { // note: this implementation - based on usage of typeid (rtti) // only does something if the class has at least one virtual function. BOOST_STATIC_WARNING(boost::is_polymorphic<T>::value); //<--- return
detail::extended_type_info_typeid_0::get_extended_type_info( typeid(t) );
Robert Ramey <ramey <at> rrsd.com> writes:
Hmm - it would be wrong if DataPtr was the base class part of derived class pointer. Perhaps the warning is over-zealous - would have to think about this.
ok. In the mean time I will disable it with BOOST_DISABLE_STATIC_WARNINGS. Btw these warnings and errors probably have to do getting metadata information from c++ datatypes? In .NET I was surprised that it was so easy to binary- serialize an object structure even one containign graph cycles. But now I am probably offending a lot of readers here...
participants (4)
-
gast128
-
Patrick Loney
-
Robert Ramey
-
Steven Watanabe