Соответствующий интерфейсный код, с которым мне приходится иметь дело, состоит из двух функций: одна для извлечения объектов, а другая - для отправки объектов в виде векторов. Проблема в том, что функция поиска возвращает const Object*
, но функция submit ожидает const vector<Object*>
.
Я знаю, что это можно решить с помощью const_cast<Object*>
, но есть ли другой, более чистый способ?
Вот код, который демонстрирует проблему:
#include <vector>
//////////// REPRESENTATIVE INTERFACE IMPLEMENTATION, DO NOT TOUCH ///////
struct Object{};
class Interface{
public:
size_t getNumObjects() const {return 10;}
const Object* getObject(size_t index) const {return nullptr;}
};
const Interface interface;
void submitObjects(const std::vector<Object*> &objects);
//////////////////////////////////////////////////////////////////////
// Task: take all objects from 'interface' and submit them to 'submitObjects'.
int main(){
std::vector<const Object*> objects;
for(size_t i = 0; i < interface.getNumObjects(); i++){
const Object* object = interface.getObject(i);
objects.push_back(object);
}
submitObjects(objects); // ERROR: no known conversion from 'vector<const Object *>' to 'const vector<Object *>'
return 0;
}
Единственный способ, которым я мог придумать, чтобы решить эту проблему, это сделать objects
a std::vector<Object*>
и вставить объекты с objects.push_back(const_cast<Object*>(object));
, но я чувствую, что должно быть лучшее решение.
Любые идеи приветствуются.
Еще немного справочной информации, почему эта проблема является действительной: const vector<Object*>
может толькопоставить const Object*
, как видно из всех его перегрузок геттера, как видно здесь: https://de.cppreference.com/w/cpp/container/vector/operator_at
Следовательно, vector<const Object*>
почти никогда не используется в интерфейсах. Поэтому идея объединения большого количества const Object*
в один большой const vector<Object*>
является верной концепцией, но кажется невозможной без const_cast
.
EDIT : Указанное выше неверно, спасибо за разъяснения. const std::vector<Object*>
может создавать неконстантные указатели, потому что мое понимание константности указателя было неверным.