Привет, баг в функции match_arg в call.hpp.
Если зарегестрировать класс как приведено ниже и в луа создать обьект этого класса передав на констуктор Class1 то match_arg вернет score 100 при проверке constructor Class1, и score 99 при проверке constructor Class2. Дальше по коду 99 < 100 а значит будет вызов констуктора с Class2 что есть баг.
Она скорее всего должна возвращать no_match если результат converter.match отрицательный. Так же было бы хорошо если функция прекращала проверку следуюших индексов если уже получен no_match.
module(L)[class_<TestClass>("TestClass") .def(constructor<Class1*>()) .def(constructor<Class2*>()) ];
В оригинальном луабинде match описан как
template< typename StackIndexList, typename SignatureList, unsigned int End = meta::size<SignatureList>::value, unsigned int Index = 1 >
struct match_struct {
template< typename TupleType >
static int match(lua_State* L, TupleType& tuple)
{
const int this_match = std::get<Index - 1>(tuple).match(L, decorate_type_t<typename SignatureList::template at<Index>>(), meta::get<StackIndexList, Index - 1>::value);
return this_match >= 0 ? // could also sum them up unconditionally
this_match + match_struct<StackIndexList, SignatureList, End, Index + 1>::match(L, tuple)
: no_match;
}
};
template< typename StackIndexList, typename SignatureList, unsigned int Index >
struct match_struct< StackIndexList, SignatureList, Index, Index >
{
template< typename TupleType >
static int match(lua_State* /*L*/, TupleType&) {
return 0;
}
};
Привет, баг в функции match_arg в call.hpp.
Если зарегестрировать класс как приведено ниже и в луа создать обьект этого класса передав на констуктор Class1 то match_arg вернет score 100 при проверке constructor Class1, и score 99 при проверке constructor Class2. Дальше по коду 99 < 100 а значит будет вызов констуктора с Class2 что есть баг.
Она скорее всего должна возвращать no_match если результат converter.match отрицательный. Так же было бы хорошо если функция прекращала проверку следуюших индексов если уже получен no_match.
module(L)[class_<TestClass>("TestClass") .def(constructor<Class1*>()) .def(constructor<Class2*>()) ];В оригинальном луабинде match описан как