172 похожих чатов

Ищу какие-то пути обхода следующего ограничения: Есть указатель на функцию fn(A)

-> bool (это необязательно, есть определённая свобода выбора, впрочем пусть это будет стартовой точкой), нужно сделать из неё указатель на функцию fn(B) -> bool(это уже менять нельзя). Можно сконвертировать B в A, скажем A::from_b(b: B).

Попытка написать обёртку сразу же заканчивается неудачей:

fn convert(f: fn(A) -> bool) {
let f_new = move |b: B| f(A::from_b(b));
some_api(f_new) // облом, ожидался указатель на функцию, получили замыкание
}

Так вот, я размышляю над этой проблемой, одна сумасшедшая идея такая — определить f_new как generic функцию:

fn f_new<F>(b: B) -> bool {
let f = [указатель на старую функцию получить из F];
f(A::from_b(b)
}
Дело за малым — получить указатель на функцию из дженерик-параметра.

Есть ещё гипотетический способ передать через глобальный thread_local сторадж, но тоже возникает масса вопросов, как потом удалять указатели на функции, которые больше не нужны.

Для удобства, пример на плейграунде, (WARNING: сейчас не компилируется)
https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=d352c38adf255c5066ab4578cfdd6865

11 ответов

14 просмотров

Почему бы не брать параметр f: F? Еще, на найтли я бы попробовал фичу с названием типа unboxed_fn_traits, и тогда let f = |x| { assert_eq!(size_of::<F>(), 0;) F::call(unsafe{ &std::mem::zeroed() }, x)} по идее должно работатт

Mikail Bagishov
Почему бы не брать параметр f: F? Еще, на найтли ...

Можно и f: F, но тогда возникнет ещё дополнительная проблема, куда девать контекст.

Mikail Bagishov
Почему бы не брать параметр f: F? Еще, на найтли ...

fn convert_and_call<F: Fn(A) -> bool>(f: F) { let f_new = move |b: B| { F::call(&f, (A::from_b(b),)) // f(A::from_b(b)) }; some_api(f_new) } Ничего не поменялось в плане ошибки: также expected fn pointer found closure

Traveller Kolsky
Да и потом, вдруг F = !, тогда код unsound

Если брать f: F аргументом, то мы точно знаем что F населен и его инстансы можно создавать

Mikail Bagishov
Если брать f: F аргументом, то мы точно знаем что ...

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

𝙽𝚒𝚌𝚔 𝙻𝚒𝚗𝚔𝚎𝚛
fn convert_and_call<F: Fn(A) -> bool>(f: F) { le...

Если обёртка для апи хочет через обычные функции каллбэк принимать, то наверное не получится. Либо в динамике генерировать обёртку либо передавать поинтер через тред локал. С другой стороны если каллбэк передавать через трейт с одной статической функцией то может сработать.

Alex Noname
Если обёртка для апи хочет через обычные функции к...

Но это не удобно с точки зрения пользователя. Каждый раз создавать пустую структуру с трейтом для этого

𝙽𝚒𝚌𝚔 𝙻𝚒𝚗𝚔𝚎𝚛
Да, я уже обозначил эти альтернативы.

Ещё одна: PR в библиотеку, чтобы был вариант API, принимающий указатель на контекст.

red75prime
Ещё одна: PR в библиотеку, чтобы был вариант API, ...

Прикольный вариант. Да, если с указателем на контекст, то можно сразу брать эту технику оборачивания, довольно интересный трюк.

Похожие вопросы

Обсуждают сегодня

Добрый вечер. Есть вопрос, а может и предложение. Был у меня диалог в другой группе о делфи и я задался вопросом: "А нельзя ли в делфи цвет //коментария и {комментария} сде...
Kraszx
24
Всем привет! Подскажи, пожалуйста, как передать в TComboBox сразу значение и id записи. На Delphi я делал так: ComboBox1.Items.AddObject('Какое-то значение', Pointer(id запис...
Евгений
13
Мдя, прикол, боевая сборка запускается (именно под отладчиком) после F9 примерно полторы минуты (97 секунд если быть точным). Начал копать - проблема детектится сразу - зависа...
Александр (Rouse_) Багель
38
Здравствуйте, вопрос по структурам данных. Были у вас случаи, когда пришлось писать деревья или двунаправленные списки?
/ /
50
Товарищи, кто работа с iphelper? Или может я в самой логике ошибки фигачу, не пойму.... var ifTable : PMIB_IFTABLE; size, corSize: DWORD; Buffer ...
Warfarellen
4
я так понимаю, я так подозреваю, что создание такого плагина для человека, кто умеет писать плагины для делфи потребует минут 5-10 времени. но это мое подозрение. хотелось бы ...
Kraszx
7
Коллеги, добрый вечер. Создаю коллекцию от TFPGMap, ключ - перечисление, значение - целое. Нужно отсортировать коллекцию по значению. Как это можно сделать?
Kirill Filippenok
11
Скажи а ты когда этот канал создавал ты уже дельфи не любил, или это со временем пришло?
Роман Лях (rgreat)
18
Привет, такой вопросик появился кажется ли вам что Rust слишком сложный/строгий для высокоуровневого программирования и слишком "безопасный"/строгий для низкоуровневого?
Крокант
10
Всем привет! Использую кастомное модальное диалоговое окошко, все по классике - mrOK, mrCancel как ModalResult. Однако есть нюанс - в главной форме есть универсальный обработч...
Олег Гранишевский
20
Карта сайта