Существует проблема с вашими требованиями.Но сначала давайте рассмотрим проблему фиксированного размера, она называется std::tr1::array<class T, size_t N>
(если вы знаете размер во время компиляции).
Если вы не знаете его во время компиляции, вы все равно можете использовать некоторый прокси-класс поверхвектор.
template <class T>
class MyVector
{
public:
explicit MyVector(size_t const n, T const& t = T()): mVector(n,t) {}
// Declare the methods you want here
// and just forward to mVector most of the time ;)
private:
std::vector<T> mVector;
};
Однако какой смысл не назначаться, если вы изменчивы?Ничто не мешает пользователю выполнять тяжелую работу:
class Type
{
public:
int a() const { return a; }
void a(int i) { a = i; }
int b() const { return b; }
void b(int i) { b = i; }
private:
Type& operator=(Type const&);
int a, b;
};
Ничто не мешает мне делать:
void assign(Type& lhs, Type const& rhs)
{
lhs.a(rhs.a());
lhs.b(rhs.b());
}
Я просто хочу ударить тебя по голове за усложнение моей жизни...
Возможно, не могли бы вы более точно описать, что вы хотите сделать, хотите ли вы ограничить подмножество возможных операций в вашем классе (некоторые переменные не должны быть доступны для изменения, а другие могут)?
В этом случае вы можете снова использовать прокси-класс
class Proxy
{
public:
// WARN: syntax is screwed, but `vector` requires a model
// of the Assignable concept so this operation NEED be defined...
Proxy& operator=(Proxy const& rhs)
{
mType.a = rhs.mType.a;
// mType.b is unchanged
return *this;
}
int a() const { return mType.a(); }
void a(int i) { mType.a(i); }
int b() const { return mType.b(); }
private:
Type mType;
};
Не так много вы не можете сделать с подходящими прокси.Это, пожалуй, самый полезный шаблон, который я когда-либо видел.