Перегрузка операторов
int i = SomeObj->Items->Count;
SomeObj->Items[1]->AnotherObj->Prop = SomethingElse;
Вопрос: Что должно возвращаться при вызове ->Items, чтобы я мог дальше использовать и 'operator[]' и 'operator->()'?
Пытался фозвращать модернизированный auto_ptr:
template <class X>
class ProPtr : public auto_ptr<X>
{
public:
...
template <class Y, class Z>
Y operator[] (Z arg) { return get()->operator[](arg); }
};
, но компилятор (Borland C++ Builder 5 Ent.) выдает ошибку "E2094 Operator '+' not implemented in type ProPtr<X>' for arguments of type 'int'". Работает лишь тогда, когда я явно вызываю оператор:
SomeObj->Items->operator[](1)->AnotherObj->...
Пожалуйста, подскажите ламеру как наиболее эффективно реализовать подобный интерфейс.
Так-то оно так, но тогда я не смогу написать '...->Items->Count'. Мне придется писать '...->Items.Count'. А вся фишка в том, что хотелось бы везде использовать оператор '->'!!!
А что если vector поместить в какой-нить класс и там сделать поле Count.
class BlaBla {
vector<bla *> Bla1;
int Count;
bla *operator [](int p) {return Bla1
;}
}
А Items сделать указателем на этот класс.
Но я скажу, что это извращенство. Зачем обязательно ->
Но я скажу, что это извращенство. Зачем обязательно ->
Абсолютно согласен с предыдущим оратором ;о)
Зачем такая упёртость? Формализм, блин, школярство и начётничество. Выбор типов для программы диктуется уж никак не каллиграфическими пристрастиями.
Ладно, ладно. Убедили. Но, тем не менее, работа с умными указателями удобнее и эстетичнее. К тому же более безопасна, чем с обычными указателями. Жаль что работающее, а главное универсальное и элегантное решение так никто и не предложил. ;-(
О-о-о! Молодой человек не ищет лёгких путей в жизни! Похвально, весма похвально! хе-хе!
Только зачем заниматься непотребными извращениями? Вы ещё не додумались до чего-нибудь вроде:
#define begin {
#define end }
#define end. }
#define procedure void
#endif
procedure MyProc()
begin
printf("MyProc");
end.
Всякой фиче - своё место и время. Не извращайте естественную семантику указателей и массивов. Умные указатели тоже палка о двух концах, а вовсе не средство на всякий случай жизни.
Вот только не надо утрировать. Подобные заморочки я придумываю для тренировки мозгов и только. А если кому-то в облом напрягаться, то зачем вообще тогда отвечать на вопросы?
Для тренировки чтих мозгов? :D
Честно говоря не вижу ничего сложного в твоей задаче. Различных решений может быть море. Все зависит от того, что нужно конкретно, т.к. задача уж очень расплывчатая.
Можно так:
template<class T>
class A :public std::vector<T, std::allocator<T> >
{
private:
struct B
{
int Count;
};
B m;
public:
B* operator->()
{
m.Count = size();
return &m;
}
};
// Test
int main(int argc, char* argv[])
{
A<int> Item;
Item.push_back(5);
int i = Item[0];
int j = Item->Count;
}
Можно вот так:
{
public:
C* operator->()
{
return this;
}
int Count;
};
Детсад все это.
А вот действительно задачка:
Нужен шаблонный класс с помощью которого можно выяснить, является ли его аргумент массивом или же указателем. И в добавок узнать тип элементов.
Т.е. к примеру
char* ptr;
ArrayChecker<array>::result == 1;
ArrayChecker<array>::element_type == char;
ArrayChecker<ptr>::result == 0;
ArrayChecker<ptr>::element_type == char;