Re: boost bind/lambda

beo wulf <[email protected]>
Newsgroups gmane.comp.lang.lua.bind.user
Message-ID <[email protected]>
Okay, this woks:
    , def( "glLightfv2", tag_function<void(int, int,
GLfloat*)>(bind(glLightfv, _1, _2, _3)))
    , def( "glLightfv3", tag_function<void(int, int, P<V<GLfloat>
>)>(bind(glLightfv, _1, _2, bind(get_raw, _3))))

However, is there a way I can do this without tag_function? I'd prefer
to not have to provide the type of every function that takes a
GLfloat*

Thanks!

On Tue, Jan 4, 2011 at 9:35 PM, beo wulf <[email protected]> wrote:
> Goal: I want to luabind all of OpenGL.
> Problem: glLightfv( int, int, GLfloat*)
>
> Almost solution:  boost::bind
>
> The following code almost works -- it can use boost::bind to convert
> functions that take arg GLfloat* to take an arg of
> boost::shared_ptr<std::vector<GLfloat>> instead. However, boost::bind
> and luabind seem to not work with each other (in particular, the line
>
> , def("glLightfv2", bind(glLightfv, _1, _2, _3)) // ths line does not compile
>
> Why?
>
> Full code below:
>
>
>
> #include <boost/shared_ptr.hpp>
> #include <boost/bind.hpp>
>
> #include <vector>
> #include <iostream>
>
> #include <luabind/luabind.hpp>
> #include <luabind/operator.hpp>
> #include <luabind/adopt_policy.hpp>
> #include <luabind/copy_policy.hpp>
> #include <luabind/class_info.hpp>
>
> #include <GL/gl.h>
>
>
>
> #define P boost::shared_ptr
> #define V std::vector
>
> float foo(int x, int y, float* f) {
>  float ans = 0;
>  ans = x + y + f[0] + f[1] + f[2];
>  return ans;
> }
>
> float* get_raw(P<V<float> > p) {
>  return &((*p)[0]);
> }
>
> void test() { // works fine
>  P<V<float> > p(new V<float>());
>  p->push_back(1);
>  p->push_back(2);
>  p->push_back(3);
>
>  // I want this to output 9
>  std::cout << bind(foo, _1, _2, bind(get_raw, _3))(1, 2, p) << std::endl;
> }
>
>
> int main() {
>  using namespace luabind;
>
>  lua_State *L;
>
>  module( L )
>    [
>    namespace_("gl") [
>      def( "glLightfv", glLightfv)
>      // Why do these two lines not compile?
> //    , def( "glLightfv2", bind(glLightfv, _1, _2, _3))
> //    , def( "glLightfv3", bind(glLightfv, _1, _2, bind(get_raw, _3)))
>    ]
>    ]
>
>    ;
> }
>

------------------------------------------------------------------------------
Learn how Oracle Real Application Clusters (RAC) One Node allows customers
to consolidate database storage, standardize their database environment, and, 
should the need arise, upgrade to a full multi-node Oracle RAC database 
without downtime or disruption
http://p.sf.net/sfu/oracle-sfdevnl
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.