C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Syntaxfrage

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Markus Pesti
Guest





PostPosted: Fri Nov 28, 2003 10:30 am    Post subject: Syntaxfrage Reply with quote



Kann man eigentlich bei:

struct obj { void dummy() {} };
std::list<obj*> objs;
// ...
for(std::list<obj*>::iterator p = objs.begin(); p != objs.end(); ++p)
(*p)->dummy();

anstelle von (*p)->dummy() etwas anderes (kürzeres) schreiben?

Markus

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Rolf Magnus
Guest





PostPosted: Fri Nov 28, 2003 11:31 am    Post subject: Re: Syntaxfrage Reply with quote



Markus Pesti wrote:

Quote:
Kann man eigentlich bei:

struct obj { void dummy() {} };
std::list<obj*> objs;
// ...
for(std::list<obj*>::iterator p = objs.begin(); p != objs.end(); ++p)
(*p)->dummy();

anstelle von (*p)->dummy() etwas anderes (kürzeres) schreiben?

Du könntest die ganze Schleife schreiben als:

std::for_each(objs.begin(), objs.end(), std::mem_fun(&obj::dummy));

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
King Leo - Martin Oberzal
Guest





PostPosted: Fri Nov 28, 2003 12:01 pm    Post subject: Re: Syntaxfrage Reply with quote



Markus Pesti wrote:

Quote:
Kann man eigentlich bei:

struct obj { void dummy() {} };
std::list<obj*> objs;
// ...
for(std::list<obj*>::iterator p = objs.begin(); p != objs.end(); ++p)
(*p)->dummy();

anstelle von (*p)->dummy() etwas anderes (kürzeres) schreiben?

Mit Hilfe dieses Templates (folgt unten) schon:

for( Iterator<std::list p = objs.begin(); p != objs.end();
++p )
p->dummy();

===========================================================
#ifndef iterator_h
#define iterator_h

#include <iterator>

/** template that returns the real type of a pointer */
template<typename T> struct remove_pointer
{
typedef typename T::value_type result;
};

template<typename T> struct remove_pointer<T*>
{
typedef T result;
};

/** template that returns a pointer of a type */
template<typename T> struct get_pointer
{
typedef T *result;
};

template<typename T> struct get_pointer<T*>
{
typedef T *result;
};

template<typename T> struct pointer_traits
{
typedef typename T::pointer pointer;
typedef typename T::value_type value_type;
};

template<typename T> struct pointer_traits<T*>
{
typedef T* pointer;
typedef T value_type;
};


/**
class Iterator
brief iterator forward class template for pointers and smart pointers

If a container holds pointers, or smart pointers the iterator access
on the real objects behind the iterators is tough.

This class forwards the real objects, standing behind the pointers.

By specialicing the pointer_traits template it's easy using this class
with smart pointers that do not have the required typedefs.

An example of the usage of this class can be found there: link
Iterator_Example.cc Iterator_Example.cc endlink
*/
template<typename iterator, typename _pointer = typename
remove_pointer struct Iterator
{
typedef typename std::iterator_traits<iterator>::iterator_category
iterator_category;
typedef typename std::iterator_traits<iterator>::difference_type
difference_type;

typedef typename pointer_traits<_pointer>::value_type value_type;
typedef typename pointer_traits<_pointer>::pointer pointer;
typedef typename pointer_traits<_pointer>::value_type &reference;

iterator it; ///< the original iterator

Iterator() {}

Iterator( iterator it ) : it( it ) {}

bool operator!=( const iterator &i ) const { return it != i; }
bool operator!=( const Iterator it != i.it; }

bool operator==( const iterator &i ) const { return it == i; }
bool operator==( const Iterator<iterator,_pointer> &i ) const { return
it == i.it; }

Iterator<iterator,_pointer>& operator=( const iterator& i ) { return it
= i; }
Iterator<iterator,_pointer>& operator--() { --it; return *this; }
Iterator<iterator,_pointer>& operator++() { ++it; return *this; }

bool operator<( const Iterator {
return it < i.it;
}

bool operator>( const Iterator<iterator,_pointer> &i ) const
{
return it > i.it;
}

bool operator<=( const Iterator {
return it <= i.it;
}

bool operator>=( const Iterator<iterator,_pointer> &i ) const
{
return it >= i.it;
}

pointer operator->() { return *it; }
reference operator*() { return *(*it); }
reference operator[]( int i ) { return *(it[i]); }

Iterator<iterator,_pointer>& operator+=( int i ) { it += i; return
*this; }
Iterator<iterator,_pointer>& operator-=( int i ) { it -= i; return
*this; }

/// returns the address of the current value
pointer address() const { return *it; }
};

template<typename T, typename U> Iterator<T,U> operator+( const
Iterator<T,U> &a, int i )
{
return Iterator<T,U>(a) + i;
}

template<typename T, typename U> Iterator<T,U> operator-( const
Iterator<T,U> &a, int i )
{
return Iterator<T,U>(a) - i;
}

#endif
===========================================================

--
1:02pm up 8 days, 16:00, 10 users, load average: 0.17, 0.17, 0.13

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
André Große
Guest





PostPosted: Fri Nov 28, 2003 5:00 pm    Post subject: Re: Syntaxfrage Reply with quote

Rolf Magnus wrote:
Quote:
Markus Pesti wrote:


Kann man eigentlich bei:

struct obj { void dummy() {} };
std::list<obj*> objs;
// ...
for(std::list<obj*>::iterator p = objs.begin(); p != objs.end(); ++p)
(*p)->dummy();


So mach ich das auch meist, komischerweise muss man wohl extra abfragen
vorher, ob die Liste leer ist?! Hab ich zumindest grad den Fehler, waere
ja echt laestig.

Quote:
anstelle von (*p)->dummy() etwas anderes (kürzeres) schreiben?


Du könntest die ganze Schleife schreiben als:

std::for_each(objs.begin(), objs.end(), std::mem_fun(&obj::dummy));


Kann man da auch irgendwie Argumente mit uebergeben ohne Objektvariablen
(oder wie die bei C++ heissen) zu bemuehen?
--
Andre'

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Rolf Magnus
Guest





PostPosted: Sat Nov 29, 2003 1:42 am    Post subject: Re: Syntaxfrage Reply with quote

André Große wrote:

Quote:
Rolf Magnus wrote:
Markus Pesti wrote:


Kann man eigentlich bei:

struct obj { void dummy() {} };
std::list<obj*> objs;
// ...
for(std::list<obj*>::iterator p = objs.begin(); p != objs.end(); ++p)
(*p)->dummy();


So mach ich das auch meist, komischerweise muss man wohl extra
abfragen vorher, ob die Liste leer ist?! Hab ich zumindest grad den
Fehler, waere ja echt laestig.

anstelle von (*p)->dummy() etwas anderes (kürzeres) schreiben?


Du könntest die ganze Schleife schreiben als:

std::for_each(objs.begin(), objs.end(), std::mem_fun(&obj::dummy));


Kann man da auch irgendwie Argumente mit uebergeben ohne
Objektvariablen (oder wie die bei C++ heissen) zu bemuehen?

Ich weiß nicht, was "Objektvariablen" sind.
Du kannst z.B. auch eine Funktion mit einem Argument aufrufen:

struct obj { void dummy(int x) {} };

int x = 3;
std::for_each(objs.begin(), objs.end(),
std::bind2nd(std::mem_fun(&obj::dummy), x);

Für mehr Argumente mußt du aber meines Wissens einen eigenen Binder
schreiben.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.