Мы пытаемся создать компонент библиотеки, который будет выполнять асинхронные вызовы. По различным причинам это должно иметь C-подобный интерфейс, поэтому мы предоставляем большой набор статических функций в качестве интерфейса к библиотеке.Контейнеры общего назначения Future/Promises
Нам также нужен пользователь для управления памятью. Так как большинство функций выглядеть
int myLibFunction(void* data, size_t data_size);
Я пытаюсь заменить это умнее будущий объект, так что мы не используем недействительные указатели и так, что доступ к данным синхронизируются между потоками. В идеале вызовы будут выглядеть примерно так:
Future<T> {
T m_data;
}
static int myLibDoJob1(Future<Func1Data>& data);
static int myLibDoJob2(Future<Func2Data>& data);
main()
{
Func1Data m_data;
Func2Data m_data2;
Future<Func1Data> future1(m_data);
Future<Func2Data> future2(m_data2);
int ret=0;
ret = myLibDoJob1(future1);
ret = myLibDoJob2(future2);
}
Это довольно чистый интерфейс и безопасность тип интерфейса силы во время компиляции. Однако проблема заключается в том, что я создаю очередь заданий для выполнения внутри себя. Однако из-за того, что фьючерсы были разных размеров, я не могу создать очередь std: я надеялся, что смогу создать std :: queue, с Job with the Future *, однако это неверно.
Я также пробовал иметь Job contains Future, где все классы Data получаются из ParentData, но безрезультатно.
Проблема очень похожа на проблему с контейнерами интеллектуальных указателей. Из-за характера команды, в которой я работаю, я не смогу выставлять какие-либо объекты повышения за пределами библиотеки, и я буду преследоваться с помощью билета в крикет, если буду делать полиморфное будущее.
Важно, чтобы код пользователя в библиотеке контролировал, где находятся данные.
С уважением, Iain
Можете ли вы использовать синтаксически действующий код в примере? – 2010-11-01 12:13:09
Полиморфизм, будь то на уровне языка или его собственная ручная реализация, является решением здесь (наряду с контейнером (возможно, умных) указателей). Я бы приобрел свою собственную биту в крикет, чтобы отбить эти атаки. –
Спасибо Оли. Фолиморфизм, как и в случае с Future1, Future2, полученный от Future, является моим текущим резервом, хотя это сделает меня непопулярным на работе. Однако из-за количества функций это может вызвать большое количество классов. Считаете ли вы, что это единственное решение? Извините, Роджер, я думал, что псевдокод сделает мое намерение ясным. – Iain