as_table

make sure an object is pushed as a table

template <typename T>
as_table_t { ... };

template <typename T>
as_table_t<T> as_function ( T&& container );

This function serves the purpose of ensuring that an object is pushed – if possible – like a table into Lua. The container passed here can be a pointer, a reference, a std::reference_wrapper around a container, or just a plain container value. It must have a begin/end function, and if it has a std::pair<Key, Value> as its value_type, it will be pushed as a dictionary. Otherwise, it’s pushed as a sequence.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#define SOL_CHECK_ARGUMENTS 1
#include <sol.hpp>

#include <vector>

int main (int, char*[]) {
	
	sol::state lua;
	lua.open_libraries();
	lua.set("my_table", sol::as_table(std::vector<int>{ 1, 2, 3, 4, 5 }));
	lua.script("for k, v in ipairs(my_table) do print(k, v) assert(k == v) end");

	return 0;
}

Note that any caveats with Lua tables apply the moment it is serialized, and the data cannot be gotten out back out in C++ as a C++ type. You can deserialize the Lua table into something explicitly using the sol::as_table_t marker for your get and conversion operations using Sol. At that point, the returned type is deserialized from a table, meaning you cannot reference any kind of C++ data directly as you do with regular userdata/usertypes. All C++ type information is lost upon serialization into Lua.

If you need this functionality with a member variable, use a property on a getter function that returns the result of sol::as_table.

This marker does NOT apply to usertypes.

You can also use this to nest types and retrieve tables within tables as shown by this example.