|
Boost : |
From: Christian Henning (chhenning_at_[hidden])
Date: 2008-03-11 22:45:00
Stjepan, quick update. I have fixed an error on my side using MSVC 7.1.
I copied now all code from the first example and get the following
compiler errors:
c:\Code Samples\boost\dataflow\first\first.cpp(71) : error C2893:
Failed to specialize function template
'boost::enable_if<boost::mpl::and_<boost::dataflow::has_default_port<OutgoingPort,boost::dataflow::args::left,boost::dataflow::signals::connect_mechanism,boost::dataflow::signals::tag>,boost::dataflow::has_default_port<IncomingPort,boost::dataflow::args::right,boost::dataflow::signals::connect_mechanism,boost::dataflow::signals::tag>>,OutgoingPort&>::type
boost::signals::operator >>=(OutgoingPort &,const IncomingPort &)'
With the following template arguments:
'processor'
'output'
c:\Code Samples\boost\dataflow\first\first.cpp(71) : error C2893:
Failed to specialize function template
'boost::enable_if<boost::mpl::and_<boost::dataflow::has_default_port<OutgoingPort,boost::dataflow::args::left,boost::dataflow::signals::connect_mechanism,boost::dataflow::signals::tag>,boost::dataflow::has_default_port<IncomingPort,boost::dataflow::args::right,boost::dataflow::signals::connect_mechanism,boost::dataflow::signals::tag>>,OutgoingPort&>::type
boost::signals::operator >>=(OutgoingPort &,IncomingPort &)'
With the following template arguments:
'processor'
'output'
c:\Code Samples\boost\dataflow\first\first.cpp(71) : error C2676:
binary '>>=' : 'processor' does not define this operator or a
conversion to a type acceptable to the predefined operator
Weird, I can compile more with 7.1 than with 8. Below is my code.
Christian
#include <iostream>
#include <tchar.h>
#include <boost/dataflow/signals/component/filter.hpp>
#include <boost/dataflow/signals/component/storage.hpp>
#include <boost/dataflow/signals/component/timed_generator.hpp>
#include <boost/dataflow/signals/connection.hpp>
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/normal_distribution.hpp>
#include <boost/random/variate_generator.hpp>
using namespace boost;
class processor : public signals::filter<processor, void (double)>
{
public:
// Initialize the Gaussian noise generator.
processor() : generator(mt, dist) {}
// Receive void(double) signals, add some Gaussian noise, and send
// out the modified value.
void operator()(double x)
{
out(x + generator());
}
private:
mt19937 mt;
normal_distribution<> dist;
boost::variate_generator<mt19937&, boost::normal_distribution<> > generator;
};
// This will be our data output. We just need to make a function object,
// and specify that it is a signals::call_consumer.
class output
{
public:
typedef dataflow::signals::call_consumer<> dataflow_traits;
void operator()(double x)
{
std::cout << x << std::endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
// For our data source, we will use timed_generator,
// which creates its own thread and outputs it's stored value
// at a specified time interval. We'll store a value of 0 to be sent out.
// The signature void(double) specifies that the signal carries a double,
// and that there is no return value.
signals::timed_generator<void (double)> input(0);
// Data processor and output:
processor proc;
output out;
// ---Connect the dataflow network ---------------------
//
// ,---------. ,---------. ,---------.
// | input | --> | proc | --> | out |
// `---------' `---------' `---------'
//
// -----------------------------------------------------
input >>= proc >>= out;
// If you prefer, you can also do:
// connect(input, proc);
// connect(proc, out);
// Tell the source to start producing data, every 0.5s:
input.enable(0.5);
// take a little nap :-)
boost::xtime xt;
boost::xtime_get(&xt, boost::TIME_UTC);
xt.sec += 10;
boost::thread::sleep(xt);
input.join();
return 0;
}
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk