Переместить вектор в вектор

можно ли переместить vector<T*> до vector<const T*>, не копируя его и не полагаясь на reinterpret_cast<>? Т. е.

vector<int*> get() {
   return ...;
}

vector<const int*> getConst() {
   return whatgoeshere(get());
}

2 ответов


Я собираюсь атаковать это с другого угла. И решить возможную проблему дизайна. Вы не указали, что в ..., но предполагая, что get заполняет вектор, а затем возвращает его, решение, на мой взгляд, состоит в том, чтобы поднять код, который заполняет снаружи и функции.

template<typename Int>
void do_get(std::vector<Int*>& v) {
  // Populate v
}

auto get() {
   std::vector<int*> ret;
   do_get(ret);
   return ret;
}

auto getConst() {
   std::vector<const int*> ret;
   do_get(ret);
   return ret;
}

один источник истины для заполнения логику. И хотя две исходные функции идентичны, это незначительно. Кроме того, по здравомыслящей реализации не будет делать лишних копий, потому что RVO потрясающе.


нет.

хотя a T* может быть легко преобразован в const T*, контейнер T* не "связано" с контейнером const T*, Так что просто нет возможности делать то, что вы просите.

учтите также, что такая функциональность может гипотетически назначить int** до const int**, что не разрешено (нет специального случая, предусмотренного для того, когда программист намеревался выполнить это назначение в рамках операции подкачки, как насколько мне известно).

кроме того, a reinterpret_cast будет просто взламывать эти факты, давая вашей программе неопределенное поведение.

вы застряли с тремя вариантами:

  • скопировать вектор (O (n))
  • сделайте так, чтобы у вас был контейнер, который вы хотели в первую очередь (O (∞))
  • сделайте так, чтобы вам не нужен новый тип контейнера вообще (O (?))