Как изменить тип данных stl-контейнеров в API, не нарушая существующее приложение? - PullRequest
0 голосов
/ 06 октября 2018

У меня есть библиотека на основе c ++, где многие API имеют контейнер stl в качестве параметра.И контейнеры stl являются типом int.Как и

f1(std::vector<int> items)
f2(std::map<int, int> mp)

Теперь тип int нужно было изменить на long long int (64-битное целое).Как и

f1(std::vector<long long int> items)
f2(std::map<long long int, int> mp)

Многие приложения уже были разработаны на основе этой библиотеки.Если я изменил сигнатуру API с int на long long int, это сломает эти приложения.И поскольку есть много API, я не хочу перегружать каждый API.

Есть ли способ поддерживать long long int в этих API, не нарушая существующие приложения и не используя перегрузку функций?

Можно ли создать класс-обертку, который будет неявно преобразовывать себя в std :: vector или std :: vector на основе вызова функции?

1 Ответ

0 голосов
/ 06 октября 2018

Дело в том, что если вы не хотите, чтобы существующие приложения ломались, вы не можете требовать, чтобы они изменили свой код.Если вам нужны 64-битные целые числа в вашем API для внутреннего использования, вы можете просто привести элементы (или скопировать входные векторы), но поскольку переданные параметры, скорее всего, являются 32-битными целыми числами, дополнительную информацию, которую может хранить long longтам нет в любом случае.Если вы хотите эффективно передать 64-битные данные, код клиента должен измениться.

РЕДАКТИРОВАТЬ: Если более новые реализации должны иметь возможность использовать long long, то я предлагаю перегрузку вбыть вашим лучшим вариантом.Приведение к vector<int> приведет к потере информации, а изменение сигнатуры единственного метода приведет к поломке текущих клиентов.Когда кто-то вызывает старый вариант, вы можете привести отдельные элементы к long long.Если вы хотите сохранить весь вектор, просто скопируйте его.

Я также предлагаю передавать вектор по (const) ссылке, вы можете избежать ненужной копии возможных больших данных, и это не сломает клиентов, так каксинтаксис вызова остается прежним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...