I would like to have a wrapper class that keeps and returns a pointer to some element of a wrapped container. It looks like:
template <typename T>
class VectorWrapper
{
public:
VectorWrapper(vector<T>& container) {
m_pointer = &container[0];
}
T* GetPointer() { return m_pointer; }
private:
T* m_pointer;
};
The problem is the input container can be a const type sometimes. In this case, is there an elegant way to avoid another implementation of VectorWrapper
that rather returns const T*
?
My approach (without luck) was the following:
template <typename T>
VectorWrapper<T> make_vector_wrapper(vector<T>& container) {
return VectorWrapper<T>(container);
}
template <typename T>
VectorWrapper<T> make_vector_wrapper(const vector<T>& container) {
// I'm stuck here. return VectorWrapper<const T>(container); doesn't work.
}
void Foo(const vector<int>& const_container) {
vector<int> mutable_container(10);
auto v1 = make_vector_wrapper(mutable_container);
*(v1.GetPointer()) = 1; // Ok
auto v2 = make_vector_wrapper(const_container);
int x = *(v2.GetPointer()); // Ok
*(v2.GetPointer()) = 1; // Would like compile error
}