Полагаю, проблема в том, что в
int ret = cb(Api::getValue<bool>(&args[--count]),
Api::getValue<double>(&args[--count]));
порядок вычисления аргумента аргумента зависит от реализации неопределенное поведение (MM-коррекция), поэтому, учитывая count
, начиная с2
, может быть
int ret = cb(Api::getValue<bool>(&args[1]),
Api::getValue<double>(&args[0]));
или
int ret = cb(Api::getValue<bool>(&args[0]),
Api::getValue<double>(&args[1]));
Чтобы быть уверенным, что первый индекс args
(bool
one) равен 1
и чтовторой (double
один) - 0
, возможный способ - использовать переменные индексы.
Если вы можете использовать C ++ 14, используя метод cbProxyHelper()
, вы можете попробовать сделать следующее: (Внимание: код не проверен)
template <typename T, typename ... Targs, std::size_t ... Is>
napi_value Api::cbProxyHelper (const napi_env env,
const napi_callback_info info,
std::index_sequence<Is...> const &)
{
// number of arguments
constexpr std::size_t count = sizeof...(Targs);
ApiValue args[count];
T (* cb)(Targs...);
// retrieve arguments and callback
if (!Api::getParams(env, info, args, count, &cb))
return nullptr;
T ret = cb(Api::getValue<Targs>(&args[count-1U-Is])...);
return Api(env).create(ret);
}
template <typename T, typename ... Targs>
napi_value Api::cbProxy (const napi_env env, const napi_callback_info info)
{ return cbProxyHelper(env, info, std::index_sequence_for<Targs...>{}); }
Если вы используете C++ 11, имитировать std::index_sequence
и std::make_index_sequence
не очень сложно.