Haha, I got what you ment. It feels kind of messy at first, but you get used to it. The thing that sucks is there aren't to many ways to do this in c++. Boost::bind is a great example. I'm lifting my events from global functions to being actual member functions, which means I have to do something like: events.AddCallback("Heartbeat", boost::bind(&Player::OnlineTime, this, _1, _2); Not exactly the best of code in terms of readability, but it is one of the easier ways (and cleaner) to do what I want.
On 4/7/2011 9:26 AM, Sina Bahram wrote:
And btw, I don't mean Tyler's code. Ty, your code is fine, man. I meant the code in genral. As in, the syntax and just the style of coding, not your implementation of it. Take care, Sina -----Original Message----- From: programmingblind-bounce@xxxxxxxxxxxxx [mailto:programmingblind-bounce@xxxxxxxxxxxxx] On Behalf Of Sina Bahram Sent: Thursday, April 07, 2011 11:22 AM To: programmingblind@xxxxxxxxxxxxx Subject: RE: boost::spirit and boost in general for c++ people. Good god, this is ugly. Seriously, you guys find that code easy to read? Take care, Sina -----Original Message----- From: programmingblind-bounce@xxxxxxxxxxxxx [mailto:programmingblind-bounce@xxxxxxxxxxxxx] On Behalf Of Ken Perry Sent: Thursday, April 07, 2011 10:07 AM To: programmingblind@xxxxxxxxxxxxx Subject: RE: boost::spirit and boost in general for c++ people. Snicker welcome to the future... Hmm how many times have I told you to use it and you told me no??? Ken -----Original Message----- From: programmingblind-bounce@xxxxxxxxxxxxx [mailto:programmingblind-bounce@xxxxxxxxxxxxx] On Behalf Of Littlefield, Tyler Sent: Thursday, April 07, 2011 9:09 AM To: programmingblind@xxxxxxxxxxxxx Subject: boost::spirit and boost in general for c++ people. hello all: Recently I got into using boost a bit and started finding uses for it all over the place. I would like to encourage those who haven't yet and use c++ to check it out; it is quite powerful and can eas some of your work and provide really cool features along the way. For example: boost::function lets you take callbacks in multiple forms; boost::bind will let you bind a functor to it's arguments and pass that as your callback, which means you can bind to a static member function, a member function (and pass the object with boost::ref), a global function and you can also use boost::lambda. There are many more utilities out there; I highly recommend checking out boost::asio, boost::fusion, boost::function and boost::bind. In the spirit of convincing you all, I wrote a small calculator program that does single operations (1+3, 3*5), etc and returns the result. My next step is to split up my parsing into different rulesets and then work on generating an AST so that I can handle larger more complex calculations. /* A simple calculator, supports multiplication, division, addition and subtraction. */ #include<boost/spirit/include/qi.hpp> #include<boost/spirit/include/phoenix_core.hpp> #include<boost/spirit/include/phoenix_operator.hpp> #include<boost/spirit/include/phoenix_operator.hpp> #include<iostream> #include<string> #include<boost/fusion/include/adapt_struct.hpp> #include<boost/fusion/container/vector.hpp> #include<boost/fusion/container/vector/convert.hpp> #include<boost/fusion/include/io.hpp> namespace qi = boost::spirit::qi; namespace ascii = boost::spirit::ascii; namespace phoenix = boost::phoenix; struct calculation { int a, b; char op; }; BOOST_FUSION_ADAPT_STRUCT(calculation, (int, a) (char, op) (int, b) ) template<typename iterator> class CParser:public qi::grammar<iterator, calculation(), qi::ascii::space_type> { qi::rule<iterator, calculation(), qi::ascii::space_type> crule; public: CParser():CParser::base_type(crule) { using qi::ascii::char_; using qi::int_; crule %= (int_>> (char_('+')|char_('-')|char_('*')|char_('/'))>> int_); } }; int main() { CParser<std::string::iterator> p; std::string str; calculation result; std::cout<< "Enter your calculation>"; getline(std::cin, str); bool r = phrase_parse(str.begin(), str.end(), p, qi::ascii::space, result); if (r) { std::cout<< "a: "<< result.a<< " b: "<< result.b<< " op: " << result.op<< std::endl; switch(result.op) { case '+': std::cout<< "Result: "<< (result.a + result.b)<< std::endl; break; case '-': std::cout<< "result: "<< (result.a - result.b)<< std::endl; break; case '*': std::cout<< "Result: "<< (result.a * result.b)<< std::endl; break; case '/': if (result.a == 0) { std::cout<< "Division by zero error."<< std::endl; break; } std::cout<< "result: "<< (result.a / result.b)<< std::endl; break; default: std::cout<< "Invalid operation."<< std::endl; } } else { std::cout<< "Invalid input."<< std::endl; } return 0; }
-- Thanks, Ty __________View the list's information and change your settings at //www.freelists.org/list/programmingblind