1 #define SOL_ALL_SAFETIES_ON 1
2 #include <sol/sol.hpp>
3 
4 
5 #include <iostream>
6 
7 struct pup {
8 	int barks = 0;
9 
barkpup10 	void bark() {
11 		++barks; // bark!
12 	}
13 
is_cutepup14 	bool is_cute() const {
15 		return true;
16 	}
17 };
18 
ultra_bark(pup & p,int barks)19 void ultra_bark(pup& p, int barks) {
20 	for (; barks-- > 0;)
21 		p.bark();
22 }
23 
picky_bark(pup & p,std::string s)24 void picky_bark(pup& p, std::string s) {
25 	if (s == "bark")
26 		p.bark();
27 }
28 
main()29 int main() {
30 	std::cout << "=== overloading with members ===" << std::endl;
31 
32 	sol::state lua;
33 	lua.open_libraries(sol::lib::base);
34 
35 	lua.set_function("bark", sol::overload(ultra_bark, []() { return "the bark from nowhere"; }));
36 
37 	lua.new_usertype<pup>("pup",
38 	     // regular function
39 	     "is_cute",
40 	     &pup::is_cute,
41 	     // overloaded function
42 	     "bark",
43 	     sol::overload(&pup::bark, &picky_bark));
44 
45 	const auto& code = R"(
46 	barker = pup.new()
47 	print(barker:is_cute())
48 	barker:bark() -- calls member function pup::bark
49 	barker:bark("meow") -- picky_bark, no bark
50 	barker:bark("bark") -- picky_bark, bark
51 
52 	bark(barker, 20) -- calls ultra_bark
53 	print(bark()) -- calls lambda which returns that string
54 	)";
55 
56 	lua.script(code);
57 
58 	pup& barker = lua["barker"];
59 	std::cout << barker.barks << std::endl;
60 	sol_c_assert(barker.barks == 22);
61 
62 	std::cout << std::endl;
63 	return 0;
64 }