views:

2435

answers:

2

Hi,

In C++, I have a map<string, string>, containing an unknown number of entries. How can I pass this to a Lua function, so that the Lua function can use the data as a table?

Hugo

+2  A: 

A couple options...

  1. Copy the map into a new Lua table, and pass the Lua table.

  2. Create a proxy table that directs reads and writes through a metatable's __index and __newindex metamethods

The drawback to (1) is all the copying, of course.

The drawback to (2) is that pairs() won't work on the proxy table

A discussion of fixes to Lua for generalized pairs is in the wiki and this mailing list thread. Generalized pairs is expected for Lua 5.2

Doug Currie
It shouldn't be too difficult to add an iterator function to the metatable that can be used just like pairs() for tables.
David Hanak
i usually do option 2; unless the table is small and there's lots of requests to a mostly read-only table.
Javier
+6  A: 

if you want a real lua table:

lua_newtable(L);
int top = lua_gettop(L);

for (std::map::iterator it = mymap.begin(); it != mymap.end(); ++it) {
    const char* key = it->first.c_str();
    const char* value = it->second.c_str();
    lua_pushstring(L, key);
    lua_pushstring(L, value);
    lua_settable(L, top);
}

with the right types for your map substituted in..

sean riley