Переместить вектор в вектор
можно ли переместить 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 (?))