Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
#include <vector>
using namespace std;
template <typename T>
class IVectorWrapper
{
public:
virtual T& operator[](size_t i) = 0;
virtual size_t size() = 0;
virtual ~IVectorWrapper() { }
};
template <typename T, typename C>
class KnownVectorWrapper : public IVectorWrapper<T>
{
public:
KnownVectorWrapper(C& _container) : container(_container) { }
T& operator[](size_t i)
{
return container[i];
}
size_t size()
{
return container.size();
}
private:
C& container;
};
template <typename T>
class VectorWrapper : IVectorWrapper<T>
{
public:
template <typename C>
VectorWrapper(C& _container) : container(new KnownVectorWrapper<T,C>(_container)) { }
~VectorWrapper() { delete container; }
T& operator[](size_t i)
{
return (*container)[i];
}
size_t size()
{
return container->size();
}
private:
IVectorWrapper<T>* container;
};
void fn(VectorWrapper<int> x)
{
int a = 0;
for (size_t i = 0; i < x.size(); ++i)
{
printf("%d ", x[i]);
}
}
void main()
{
vector<int> a;
a.push_back(7);
a.push_back(15);
fn(a);
}template <typename T>
class VectorWrapper
{
public:
VectorWrapper(vector<T>& _container) : sv(_container), container(&sv) { }
VectorWrapper(QList<T>& _container) : qv(_container), container(&qv) { }
T& operator[](size_t i) { return (*container)[i]; }
size_t size() { return container->size(); }
private:
KnownVectorWrapper<T,vector<T>> sv;
KnownVectorWrapper<T,QList<T>> qv;
IVectorWrapper<T>* container;
};template <typename T, typename C>
class KnownVectorWrapper : public IVectorWrapper<T>
{
public:
KnownVectorWrapper() : container(*(C*)NULL) { }
KnownVectorWrapper(C& _container) : container(_container) { }
// ...
template <typename Container>
void fn(Container & c)
{
for (auto & i : c)
{
doSomething(i);
}
}
::std::vector<int> sv;
QList<int> qv;
OtherSuperVector<int> ov;
fn(sv);
fn(qv);
fn(ov);
template <typename T>
class VectorWrapper
{
public:
template <typename C>
VectorWrapper(C& container) :
_getter(boost::bind(&C::operator[], &container, _1)),
_sizeGetter(boost::bind(&C::size, &container))
{
}
T& operator[](size_t i)
{
return _getter(i);
}
size_t size()
{
return _sizeGetter();
}
private:
boost::function<T&(size_t) > _getter;
boost::function<size_t() > _sizeGetter;
};
«Концепты» на C++