 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Markus Pesti Guest
|
Posted: Fri Nov 28, 2003 10:30 am Post subject: Syntaxfrage |
|
|
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
|
Posted: Fri Nov 28, 2003 11:31 am Post subject: Re: Syntaxfrage |
|
|
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
|
Posted: Fri Nov 28, 2003 12:01 pm Post subject: Re: Syntaxfrage |
|
|
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
|
Posted: Fri Nov 28, 2003 5:00 pm Post subject: Re: Syntaxfrage |
|
|
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
|
Posted: Sat Nov 29, 2003 1:42 am Post subject: Re: Syntaxfrage |
|
|
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 |
|
 |
|
|
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
|
|