Traktuj wektor <int *> jako wektor <const int *> bez kopiowania (C ++ 0x)

Klasa zawiera astd::vector<int*>. Kod zewnętrzny wymaga dostępu tylko do odczytu do tego wektora, nie powinien mieć możliwości modyfikowania zawartości (ani wskaźników, ani ich zawartości). Wewnątrz klasy wartościmoże zmienić (np.double_values(), a więc przechowywanie ich jakostd::vector<const int*> nie jest możliwe.

Czy istnieje sposób na zwróceniestd::vector<int*> jakstd::vector<const int*> bez robienia kopii? Wydaje się, że powinno być, ponieważ const po prostu działa w czasie kompilacji, aby powiedzieć, co można i czego nie można zmodyfikować.

Kod: (kompiluj zg++ -std=c++0x)

<code>class ReadOnlyAccess
{
public:
  ReadOnlyAccess(const std::vector<int*> & int_ptrs_param):
    int_ptrs(int_ptrs_param)
  {
  }
  const std::vector<int*> & get_int_ptrs() const
  {
    return int_ptrs;
  }
  std::vector<const int*> safely_get_int_ptrs() const
  {
    // will not compile (too bad):
    //    return int_ptrs;

    // need to copy entire vector
    std::vector<const int*> result(int_ptrs.size());
    for (int k=0; k<int_ptrs.size(); k++)
      result[k] = int_ptrs[k];
    return result;
  }
  void double_values()
  {
    for (int*p : int_ptrs)
      *p *= 2;
  }
  void print() const
  {
    for (const int * p : int_ptrs)
      std::cout << *p << " ";
    std::cout << std::endl;
  }
private:
  std::vector<int*> int_ptrs;
};

int main() {
  ReadOnlyAccess roa(std::vector<int*>{new int(10), new int(20), new int(100)});
  std::vector<const int*> safe_int_ptrs = roa.safely_get_int_ptrs();
  // does not compile (good)
  // *safe_int_ptrs[0] = -100000;
  roa.print();

  const std::vector<int*> & int_ptrs = roa.get_int_ptrs();
  // changes are made to the internal class values via the accessor! nooooo!
  *int_ptrs[0] = -100000;
  roa.print();

  return 0;
}
</code>

questionAnswers(2)

yourAnswerToTheQuestion