Я обновляю некоторый существующий код C ++, который датируется около 25 лет.В коде есть ряд функций типа «применить функцию к коллекции» с сигнатурами, такими как
void *CNode::DoUntil(CNode *aRoot, TestFunc1 aFunc, void *aParam)
, где aFunc
имеет сигнатуру
void *(*TestFunc1)(CNode *xNode, void *xParam)
Это относится aFunc
ккаждый элемент в коллекции, пока aFunc
не вернет ненулевое значение.В большинстве случаев это используется для создания таких операций, как «find», которые возвращают указатель на найденный объект, но иногда это такие операции, как «count», где целое число вставляется в возвращаемое значение void *
и вытягиваетсяобратно назад вызывающим абонентом.Излишне говорить, что это 1) безобразно и 2) вызывает крики компиляторов.Например:
dataItemID = (itemID)CNode::DoUntil(getDatabase(), FindItemFuncPtr, &data)
выдает ошибку cast from pointer to smaller type 'itemID' (aka 'unsigned int') loses information
.
Что является подходящим идиоматическим способом возврата данных произвольного типа из функции в этой ситуации?Как минимум, он должен поддерживать целые числа, логические значения и указатели, и из-за используемого мной компилятора он не может использовать конструкции, более новые, чем C ++ 11.
Я не хочусделать большую переписать код;в идеале я бы просто изменил задействованные функции, чтобы получить std::any
, но это часть C ++ 17, а не C ++ 11.