Как я могу добавить глобальную std :: map в chaiscript?

Я хотел бы передать std::map в chaiscript. Однако я не уверен, как это сделать. Мой код в настоящее время выглядит следующим образом:

#include <map>
#include <string>
#include <chaiscript/chaiscript.hpp>

int main(int argc, char* argv[]) {
chaiscript::ChaiScript chai;
auto data = std::map<std::string, std::string>{
{ "key1", "val1"},
{ "key2", "val2"},
};
chai.add_global(chaiscript::var(&data), "data");
chai.eval(R"(
print(data["key1"]);
)");
}

Тем не менее, этот код вылетает за исключением того, что chaiscript не знает что делать с кронштейном [] оператор. Как я могу это исправить?

я мог сказать chaiscript что такое правильная функция, но я бы предпочел, если карта совместима с chaiscriptс внутренней Map тип!

Обновить:

Я нашел немного в документации, которая объясняет, что chaiscript Тип карты поддерживает произвольный ввод. Глядя на код, кажется, это делается Boxed_Value тип. Тем не менее, это, вероятно, означает, что принципиально невозможно напрямую вставить std::map в сценарии.

Сейчас я думаю о написании пользовательского типа или функции преобразования для решения проблемы. Держу вас в курсе …

0

Решение

Насколько я вижу, из коробкиchaiscript только предоставляет вам std::map<std::string,chaiscript::Boxed_Value> тип карты. Поэтому, если вы хотите добавить свою собственную карту в скрипт, вам нужно либо предоставить chaiscript с новым типом или преобразовать в заданный. Таким образом, я вижу следующие решения:

Случай 1: Вам нужно только получить карту из chaiscript на с ++

Этот случай можно найти в документации. Вам нужно предоставить функцию преобразования, и все готово.

chai.add(chaiscript::map_conversion<std::map<std::string, std::string>>());
auto map = chai.boxed_cast<std::map<std::string, std::string>>(chai.eval("data"));

Случай 2: Вам нужно только предоставить карту chaiscript из с ++

Это в основном так же, как Случай 1, но вы должны сами обеспечить функцию преобразования.

auto convert = [](const std::map<std::string, std::string>& std_map) {
auto chai_map = std::map<std::string, chaiscript::Boxed_Value>{};
for (auto&& entry : std_map)
chai_map.emplace(entry.first, chaiscript::var(entry.second));
return chai_map;
};
chai.add(chaiscript::var(convert(data)),"data");

Случай 3: вы хотите поделиться глобальным значением между chaiscript и с ++

Этот случай довольно сложный. Вы должны либо поставить chaiscript с функциями get_map () и send_map (), которые обрабатывают синхронизацию данных:

chai.eval(R"(
data = get_map();
data["key1"] = "val1";
send_map(data);
)");

Или вы должны добавить пользовательский тип данных, который обрабатывает синхронизацию в фоновом режиме.

Мое решение:

К счастью для моего случая, мне не нужно общее состояние между chaiscript и C ++, и, следовательно, может положиться на решение для Дело 2.

0

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

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector