Как мне вернуть ‘nil’ из расширения ruby ​​C ++, используя Rice?

Я разрабатываю расширение Ruby C ++, используя Rice, и у меня есть метод поиска в C ++, который возвращает либо указатель, либо указатель NULL.

Instrument* Parser::getInstrumentPtr(const long int code) {
Instrument* instru = NULL;
instrument_db::iterator instr_iter = std::find_if(instruments.begin(), instruments.end(), FindInstrument(code));
if (instr_iter != instruments.end())
{
instru = &(*instr_iter);
}
else
std::cout << "Not found C++" << std::endl;
return instru;
}

Этот метод упакован в ruby ​​следующим образом:

    Data_Type<Parser> rb_cParser =  define_class<Parser>("Parser")
.define_constructor(Constructor<Parser, const char*>())
.define_method("file=", &Parser::setFileName)
.define_method("file", &Parser::getFileName)
.define_method("instruments", &Parser::getInstruments)
.define_method("find_instrument", &Parser::getInstrumentPtr)
.define_method("find_instrument_by_composite_code", &Parser::getInstrumentByCompositeCode);

Я хочу метод рубина find_instrument возвращать ноль в случае, если инструмент не найден.
Пока что я получаю в ruby ​​объект Instrument:

instr_parser.instruments.each do | instr|
instr_ref = parser.find_instrument(instr.code)
pp instr_ref
if !instr_ref.nil?
#puts "Found instrument #{instr_ref.code}"puts "Reference is instrument #{instr.code}"else
puts "Not found"end
end
======> OUTPUT ======>
#<Instrument:0x000000087a1ab8>
Reference is instrument -1
Not found C++
#<Instrument:0x000000087a1158>
Reference is instrument -1
...

Я думал, что Райс знает, как управлять указателями NULL и выполнять преобразование в объект ruby ​​nil …

  • Я сделал что-то не так (я не эксперт C ++)?
  • Что я могу сделать, чтобы вернуть ноль?

0

Решение

в C ++ NULL равен 0, это не указатель, это определено в cstddef #define NULL 0 попробуй вернуть nullptr instand

0

Другие решения


По вопросам рекламы [email protected]