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 }