[fusion] Adapted struct I/O

Hi, I'm still taking early steps with Boost.Fusion. I'm trying to adapt a bunch of struct and template struct for easy I/O operations. I don't understand one thing from the docs. Here we go; 1) Given the example [1] of template struct adoption: namespace demo { template<typename Name, typename Age> struct employee { Name name; Age age; }; } // Any instantiated demo::employee is now a Fusion sequence BOOST_FUSION_ADAPT_TPL_STRUCT( (Name)(Age), (demo::employee) (Name)(Age), (Name, name) (Age, age)) [1] http://www.boost.org/doc/libs/1_47_0/libs/fusion/doc/html/fusion/adapted/ada... 2) The included comment says "demo::employee is now a Fusion sequence". 3) Jumping to I/O and out docs, reading that [2] "The I/O operators: << and >> work generically on all Fusion sequences. " [2] http://www.boost.org/doc/libs/1_47_0/libs/fusion/doc/html/fusion/sequence/op... 4) Means, I should be able to stream Fusion-adopted demo::employee #include <iostream> #include <string> #include <boost/fusion/adapted/struct/adapt_struct.hpp> #include <boost/fusion/include/adapt_struct.hpp> #include <boost/fusion/sequence/io.hpp> #include <boost/fusion/include/io.hpp> // code from above example goes here int main() { demo::employee<std::string, int> e; std::cout << e << std::endl; } 5) Given what I have learned above, I expect the cout << e to work: $ g++ -I/home/mloskot/dev/boost/_svn/trunk boost_fusion.cpp boost_fusion.cpp: In function ‘int main()’: boost_fusion.cpp:28:18: error: no match for ‘operator<<’ in ‘std::cout << e’ ... I assume complete error is not necessary as my question is of general nature. Is my expectation valid? Best regards, -- Mateusz Loskot, http://mateusz.loskot.net Charter Member of OSGeo, http://osgeo.org Member of ACCU, http://accu.org

Le 02/11/11 23:56, Mateusz Łoskot a écrit :
Hi,
I'm still taking early steps with Boost.Fusion. I'm trying to adapt a bunch of struct and template struct for easy I/O operations. I don't understand one thing from the docs. Here we go;
1) Given the example [1] of template struct adoption:
namespace demo { template<typename Name, typename Age> struct employee { Name name; Age age; }; }
// Any instantiated demo::employee is now a Fusion sequence BOOST_FUSION_ADAPT_TPL_STRUCT( (Name)(Age), (demo::employee) (Name)(Age), (Name, name) (Age, age))
[1] http://www.boost.org/doc/libs/1_47_0/libs/fusion/doc/html/fusion/adapted/ada...
2) The included comment says "demo::employee is now a Fusion sequence".
3) Jumping to I/O and out docs, reading that [2]
"The I/O operators:<< and>> work generically on all Fusion sequences. "
[2] http://www.boost.org/doc/libs/1_47_0/libs/fusion/doc/html/fusion/sequence/op...
4) Means, I should be able to stream Fusion-adopted demo::employee
#include<iostream> #include<string> #include<boost/fusion/adapted/struct/adapt_struct.hpp> #include<boost/fusion/include/adapt_struct.hpp> #include<boost/fusion/sequence/io.hpp> #include<boost/fusion/include/io.hpp>
// code from above example goes here
int main() { demo::employee<std::string, int> e; std::cout<< e<< std::endl; }
5) Given what I have learned above, I expect the cout<< e to work:
$ g++ -I/home/mloskot/dev/boost/_svn/trunk boost_fusion.cpp boost_fusion.cpp: In function ‘int main()’: boost_fusion.cpp:28:18: error: no match for ‘operator<<’ in ‘std::cout<< e’ ... I assume complete error is not necessary as my question is of general nature.
Is my expectation valid?
Hi, try adding #include <boost/fusion/include/io.hpp> It is at the end of [2] http://www.boost.org/doc/libs/1_47_0/libs/fusion/doc/html/fusion/sequence/op... Best, Vicente

On 3 November 2011 00:41, Vicente J. Botet Escriba <vicente.botet@wanadoo.fr> wrote:
Le 02/11/11 23:56, Mateusz Łoskot a écrit :
4) Means, I should be able to stream Fusion-adopted demo::employee
#include <iostream> #include <string> #include <boost/fusion/adapted/struct/adapt_struct.hpp> #include <boost/fusion/include/adapt_struct.hpp> #include <boost/fusion/sequence/io.hpp> #include <boost/fusion/include/io.hpp>
// code from above example goes here
Hi,
try adding
#include <boost/fusion/include/io.hpp>
It is at the end of
Hi, It is there. See my example above. BTW, I should have mentioned I use Boost trunk with GCC 4.5.2 and Visual C++ 2010 Best regards, -- Mateusz Loskot, http://mateusz.loskot.net Charter Member of OSGeo, http://osgeo.org Member of ACCU, http://accu.org

Hi Mateusz, 2011/11/2 Mateusz Łoskot <mateusz@loskot.net>:
On 3 November 2011 00:41, Vicente J. Botet Escriba <vicente.botet@wanadoo.fr> wrote:
try adding
#include <boost/fusion/include/io.hpp>
It is at the end of
Hi,
It is there. See my example above.
While io.hpp includes the appropriate operator<<, it defines it in namespace fusion and fusion::operators. Since the code generated from struct adaptation appears to reside in fusion::traits and fusion::extension, I'm guessing that adapted structs don't have ADL kicking in. Placing a 'using boost::fusion::operators::operator<<;' declaration in namespace demo is one way to fix the problem. HTH, Nate

Hi Nathan, 2011/11/3 Nathan Crookston <nathan.crookston@gmail.com>:
2011/11/2 Mateusz Łoskot <mateusz@loskot.net>:
On 3 November 2011 00:41, Vicente J. Botet Escriba <vicente.botet@wanadoo.fr> wrote:
try adding
#include <boost/fusion/include/io.hpp>
It is at the end of
It is there. See my example above.
While io.hpp includes the appropriate operator<<, it defines it in namespace fusion and fusion::operators. Since the code generated from struct adaptation appears to reside in fusion::traits and fusion::extension, I'm guessing that adapted structs don't have ADL kicking in. Placing a 'using boost::fusion::operators::operator<<;' declaration in namespace demo is one way to fix the problem.
Spot on. Works. Thanks! Not sure if I missed it while reading the docs, or the docs don't mention this trick. Best regards, -- Mateusz Loskot, http://mateusz.loskot.net Charter Member of OSGeo, http://osgeo.org Member of ACCU, http://accu.org

Le 03/11/11 01:55, Mateusz Łoskot a écrit :
On 3 November 2011 00:41, Vicente J. Botet Escriba <vicente.botet@wanadoo.fr> wrote:
Le 02/11/11 23:56, Mateusz Łoskot a écrit :
4) Means, I should be able to stream Fusion-adopted demo::employee
#include<iostream> #include<string> #include<boost/fusion/adapted/struct/adapt_struct.hpp> #include<boost/fusion/include/adapt_struct.hpp> #include<boost/fusion/sequence/io.hpp> #include<boost/fusion/include/io.hpp>
// code from above example goes here Hi,
try adding
#include<boost/fusion/include/io.hpp>
It is at the end of Hi,
It is there. See my example above.
Sorry, I should to sleep earlier ;-) Best, Vicente
participants (3)
-
Mateusz Łoskot
-
Nathan Crookston
-
Vicente J. Botet Escriba