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