Skip to content

Commit

Permalink
New example for constructor usage!
Browse files Browse the repository at this point in the history
  • Loading branch information
ThePhD committed Nov 19, 2020
1 parent ef33531 commit d0eba0a
Showing 1 changed file with 50 additions and 0 deletions.
50 changes: 50 additions & 0 deletions examples/source/usertype.constructors.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
#define SOL_ALL_SAFETIES_ON 1
#include <sol/sol.hpp>

#include <string>
#include <iostream>

class MyClass {
public:
MyClass(double d) : data(d) {}
double data;
};

int main() {
std::cout << "=== coroutine ===" << std::endl;


sol::state lua;
lua.open_libraries(sol::lib::base);

lua.new_usertype<MyClass>("MyClass",
sol::meta_function::construct, sol::factories(
// MyClass.new(...) -- dot syntax, no "self" value passed in
[](const double& d) {return std::make_shared<MyClass>(d);},
// MyClass:new(...) -- colon syntax, passes in the "self" value
// as first argument implicitly
[](sol::object, const double& d) {return std::make_shared<MyClass>(d);}
),
// MyClass(...) syntax, only
sol::call_constructor, sol::factories([](const double& d) {return std::make_shared<MyClass>(d);}),
"data", &MyClass::data
);

sol::optional<sol::error> maybe_error = lua.safe_script(R"(
d1 = MyClass(2.1)
d2 = MyClass:new(3.1)
d3 = MyClass(4.1)
assert(d1.data == 2.1)
assert(d2.data == 2.1)
assert(d3.data == 2.1)
)", sol::script_pass_on_error);

if (maybe_error) {
// something went wrong!
std::cerr << "Something has gone horribly unexpected and wrong:\n" << maybe_error->what() << std::endl;
return 1;
}

// everything is okay!
return 0;
}

0 comments on commit d0eba0a

Please sign in to comment.