user2485710
user2485710

Reputation: 9801

How to create a C++ compatible function object in LUA?

I'm thinking about how to design my APIs, I plan to have a C++ application with a scripting layer in LUA .

For a couple of key points in my design I would like to give the ability to the user to create a function object that represents what he wants to do in LUA, than send this function object from LUA to C/C++ .

In pseudo code, in C++ I have a class T

class T {
...
int num1 = 0;
float num2 = 0.0f;
std::string str{"NONE"};
...
};

And I would like to manipulate an instance of T with a function object provided from LUA like so

void applyFunc(T t,F f){
f(t);
}

The problem is that I can't find nothing in LUA that creates a function object like a C++11 lambda or std::function or any other object that can be considered a function object.

Really my point is: how to define a C++ compatible function object in LUA ?

Upvotes: 4

Views: 770

Answers (1)

Mud
Mud

Reputation: 28991

The problem is that I can't find nothing in LUA that creates a function object like a C++11 lambda or std::function or any other object that can be considered a function object.

That's what the function keyword does. This is a lambda. It's easy enough to pass these to C++ and let the C++ code call them.

As for this:

void applyFunc(T t,F f){  
   f(t);  
}  

In principle it's easy: push the C++ object pointer onto the Lua stack as a userdata and call the Lua function. The problem is the Lua code can't do anything with a C++ pointer.

If you want the Lua code to be able to manipulate the object you pass it, you'll need to write manipulator methods in C++ and expose them to Lua. You usually do that by creating a metatable for the userdata.

There are libraries that this that automatically for C++. If you want to do it by hand (my preference), you should probably start here.

If you Google "C++ object Lua __index" that should net you numerous examples. I could code up an example later, but I'm at work at the moment.

Upvotes: 1

Related Questions