Cannot register type in chaiscript

405 Views Asked by At

I want to register a type in chaiscript for transfering data from a chaiscript function to the c++ space:

class Layout {
    std::string         device_id;
    std::string         address;
    std::vector<bool>   bits;

    public:
        Layout(std::string id)
            : device_id(id)
        { /* Intentionally left blank */ }

        void setDeviceId(std::string id) {
            this->device_id = id;
        }

        const std::string getDeviceId(void) const {
            return this->device_id;
        }

        void setAddress(std::string addr) {
            this->address = addr;
        }

        const std::string getAddress(void) const {
            return this->address;
        }

        // overload with std::vector<bool> outcommented for simplicity
        void setBits(std::vector<int> v) {
            this->bits.clear();
            for (auto b : v) {
                this->bits.push_back(b != 0);                         
            }
        }

        const std::vector<bool> getBits(void) const {
            return this->bits;
        }
};

to do this in chaiscript:

def generate(name, params) {
    var layout = Layout(name);
    layout.setAddress("");
    layout.setBits([0, 1, 0, 1, 0, 0, 0, 0]);
    return layout;
}

But am getting a huge template error output which I do not understand, unfortunately.

The code which registers the type:

void register_layout_type(std::shared_ptr<chaiscript::ChaiScript> engine)
    noexcept
{
    //engine->add(chaiscript::constructor<Layout (std::string)>(), "Layout");
    //engine->add(chaiscript::user_type<Layout>(), "Layout");

    chaiscript::ModulePtr m = chaiscript::ModulePtr(new chaiscript::Module());
    chaiscript::utility::add_class<Layout>(*m,
            "Layout",
            {
                chaiscript::constructor<Layout()>(),
                // chaiscript::constructor<Test(const Test &)>()
            },

            {
                { chaiscript::fun(&Layout::setDeviceId,     "setDeviceId") },
                { chaiscript::fun(&Layout::getDeviceId,     "getDeviceId") },
                { chaiscript::fun(&Layout::setAddress,      "setAddress") },
                { chaiscript::fun(&Layout::getAddress,      "getAddress") },
                { chaiscript::fun(&Layout::getBits,         "getBits") },
                //{ chaiscript::fun(static_cast<void Layout::(*std::vector<bool>)>(&Layout::setBits), "setBits") },
                { chaiscript::fun(&Layout::setBits, "setBits") }
            });

    engine->add(m);
}

Excerpt from the output:

<WORKDIR>src/expr/computer.cpp: In function 'void imc::expr::register_layout_type(std::shared_ptr<chaiscript::ChaiScript>)':
<WORKDIR>src/expr/computer.cpp:178:22: error: no matching function for call to 'add_class(chaiscript::Module&, const char [7], <brace-enclosed initializer list>, <brace-enclosed initializer list>)'
                     });
                      ^
In file included from <WORKDIR>src/chaiscript/include/chaiscript/dispatchkit/bootstrap.hpp:14:0,
                 from <WORKDIR>src/chaiscript/include/chaiscript/chaiscript_stdlib.hpp:23,
                 from <WORKDIR>src/chaiscript/include/chaiscript/chaiscript.hpp:825,
                 from <WORKDIR>src/expr/computer.cpp:5:
<WORKDIR>src/chaiscript/include/chaiscript/dispatchkit/../utility/utility.hpp:53:12: note: candidate: template<class Class, class ModuleType> void chaiscript::utility::add_class(ModuleType&, const string&, const std::vector<std::shared_ptr<chaiscript::dispatch::Proxy_Function_Base> >&, const std::vector<std::pair<std::shared_ptr<chaiscript::dispatch::Proxy_Function_Base>, std::__cxx11::basic_string<char> > >&)
       void add_class(ModuleType &t_module,
            ^~~~~~~~~
<WORKDIR>src/chaiscript/include/chaiscript/dispatchkit/../utility/utility.hpp:53:12: note:   template argument deduction/substitution failed:
<WORKDIR>src/expr/computer.cpp:178:22: note:   cannot convert '{{chaiscript::fun(T&&, const Q&) [with T = void (imc::types::platform::Layout::*)(std::__cxx11::basic_string<char>); Q = char [12]; chaiscript::Proxy_Function = std::shared_ptr<chaiscript::dispatch::Proxy_Function_Base>]("setDeviceId")}, {chaiscript::fun(T&&, const Q&) [with T = const std::__cxx11::basic_string<char> (imc::types::platform::Layout::*)() const; Q = char [12]; chaiscript::Proxy_Function = std::shared_ptr<chaiscript::dispatch::Proxy_Function_Base>]("getDeviceId")}, {chaiscript::fun(T&&, const Q&) [with T = void (imc::types::platform::Layout::*)(std::__cxx11::basic_string<char>); Q = char [11]; chaiscript::Proxy_Function = std::shared_ptr<chaiscript::dispatch::Proxy_Function_Base>]("setAddress")}, {chaiscript::fun(T&&, const Q&) [with T = const std::__cxx11::basic_string<char> (imc::types::platform::Layout::*)() const; Q = char [11]; chaiscript::Proxy_Function = std::shared_ptr<chaiscript::dispatch::Proxy_Function_Base>]("getAddress")}, {chaiscript::fun(T&&, const Q&) [with T = const std::vector<bool> (imc::types::platform::Layout::*)() const; Q = char [8]; chaiscript::Proxy_Function = std::shared_ptr<chaiscript::dispatch::Proxy_Function_Base>]("getBits")}, {chaiscript::fun(T&&, const Q&) [with T = void (imc::types::platform::Layout::*)(std::vector<int>); Q = char [8]; chaiscript::Proxy_Function = std::shared_ptr<chaiscript::dispatch::Proxy_Function_Base>]("setBits")}}' (type '<brace-enclosed initializer list>') to type 'const std::vector<std::pair<std::shared_ptr<chaiscript::dispatch::Proxy_Function_Base>, std::__cxx11::basic_string<char> > >&'
                     });
                      ^
In file included from <WORKDIR>src/chaiscript/include/chaiscript/dispatchkit/bootstrap.hpp:14:0,
                 from <WORKDIR>src/chaiscript/include/chaiscript/chaiscript_stdlib.hpp:23,
                 from <WORKDIR>src/chaiscript/include/chaiscript/chaiscript.hpp:825,
                 from <WORKDIR>src/expr/computer.cpp:5:
<WORKDIR>src/chaiscript/include/chaiscript/dispatchkit/../utility/utility.hpp:73:7: note: candidate: template<class Enum, class ModuleType> typename std::enable_if<std::is_enum<_Tp>::value, void>::type chaiscript::utility::add_class(ModuleType&, const string&, const std::vector<std::pair<typename std::underlying_type<_Tp>::type, std::__cxx11::basic_string<char> > >&)
       add_class(ModuleType &t_module,
       ^~~~~~~~~
<WORKDIR>src/chaiscript/include/chaiscript/dispatchkit/../utility/utility.hpp:73:7: note:   template argument deduction/substitution failed:
<WORKDIR>src/chaiscript/include/chaiscript/dispatchkit/../utility/utility.hpp: In substitution of 'template<class Enum, class ModuleType> typename std::enable_if<std::is_enum<_Tp>::value, void>::type chaiscript::utility::add_class(ModuleType&, const string&, const std::vector<std::pair<typename std::underlying_type<_Tp>::type, std::__cxx11::basic_string<char> > >&) [with Enum = imc::types::platform::Layout; ModuleType = <missing>]':
<WORKDIR>src/expr/computer.cpp:178:22:   required from here
<WORKDIR>src/chaiscript/include/chaiscript/dispatchkit/../utility/utility.hpp:73:7: error: no type named 'type' in 'struct std::enable_if<false, void>'
<WORKDIR>src/chaiscript/include/chaiscript/dispatchkit/../utility/utility.hpp:99:7: note: candidate: template<class EnumClass, class ModuleType> typename std::enable_if<std::is_enum<_Tp>::value, void>::type chaiscript::utility::add_class(ModuleType&, const string&, const std::vector<std::pair<EnumClass, std::__cxx11::basic_string<char> > >&)
       add_class(ModuleType &t_module,
       ^~~~~~~~~
[...]
0

There are 0 best solutions below