Евгений Шатунов, пишу нативный модуль для node.js c помощью node-addon-api. Там идет работа с массивом объектов. В объекте поля могут содержать разные типы и их удобно представлять с помощью variant. Ну, и, соответственно, при обратной конвертации проще все поля привести к строкам, т.к. они всё равно будут показаны в UI, а там тип не важен
Евгений Шатунов, можно и тип проверять, но никаких instanceOf у variant нет и это делается с помощью std::variant::index, а он зависит от порядка объявления типов в шаблоне... Тоже криво как-то
Евгений Шатунов, Napi::Array используется, с ним проблем нет. Структура данных упрощенно такая: [{a: 1}, {a: 2}, {b: 'z'}]. Загвоздка тут с внутренними объектами.
Не хочу использовать Napi::Типы для внутренних расчетов во-первых, потому что не понятно как они внутри устроены насколько просядет производительность, во-вторых, они слишком урезаны по функционалу (у Napi::Array, например, нет даже метода push), в-третьих, я бы хотел сохранить ядро вычислений на чистом С++, а Napi использовать только как обертку на входе и выходе
tamtakoe, а на такой счет тебе и std::variant тоже не нужен, т.к. у него все те же проблемы с производительностью. Использовать вариант удачно получается только в крайне ограниченном наборе случаев. Один из таких случаев - это возврат из функции значения или ошибки одним объектом вместо кортежа. И в этом случае вариант не уходит дальше результата функции. Примеров, где длительное хранение варианта оправдано, вообще почти нет.
Как только ты хочешь уйти от слабой типизации ноды, переходить тебе остается только к строгой типизации C++.
tamtakoe, в любом случае, чтобы перевести int в std::string, достаточно документации.
Мои вопросы были для того чтобы убедиться что ты выбрал правильный инструмент для решения своей задачи. Пока видно что инструмент выбран неправильно и твой текущий вопрос - это только начало твоих проблем в следствии сделанного выбора.
tamtakoe, to_string работает с аргументом типа int, про который у тебя задан вопрос.
Ты в курсе что у тебя variant<std::string, int> value = 100 и ты понимаешь что тебе нужно строковое значение. У тебя нет проблемы в понимании, как использовать std::to_string.
А вот по поводу принципов работы твоего кода - это ведь отдельный вопрос, который и задать стоит отдельно, с другими тегами.
Я думаю, если ты поставишь тег ноды и исчерпывающе опишешь создаваемый тобой механизм, то у тебя будут хорошие ответы.
Евгений Шатунов, ну, это нужно проверять тип и если это число, то конвертить в строку, а я как раз хотел избежать проверки типа и лишнего кода. Ну, ну раз нельзя, так нельзя :)
Про тег ноды хороший совет. Помучаюсь еще и задам более расширенный вопрос. В любом случае, спасибо!
Ну почему же нельзя.
В моем фреймворке есть подсистема конверсии. Для пользователя это выглядит как одна функция Black::Convert. Она употребляет всё, от простых или стандартных типов, до линейных и ассоциативных контейнеров, или любых объектов любого типа, для которого инстанцирован тип конвертера.
В подсистеме больше 60 шаблонных функций. И это все работает как из строки, так и в строку. При чем, конверсия идет не только относительно std::string, а относительно всех стандартных типов строк и между всеми ними.
Ты можешь попробовать реализовать что-нибудь подобное для себя.
Евгений Шатунов, странно, что для таких, казалось бы, не редких задач, в С++ не существует нормальных библиотек и люди вынуждены писать свои фреймворки :)