Valarray
Michael VanLoon
MichaelV@EDIFECS.COM
Fri Nov 19 14:01:00 GMT 1999
Is there something these macros would gain? Does the gain outweigh the
obfuscation, especially in the debugger, that the macros cause?
-----Original Message-----
From: Marc Lepage [ mailto:mlepage@molecularmining.com ]
Sent: Friday, November 19, 1999 7:54 AM
To: libstdc++@sourceware.cygnus.com
Subject: Re: Valarray
Gabriel Dos Reis wrote:
>
> Current CVS trees (both GCC and libstdc++-v3) are more up-to-date.
Thanks. I'm using GCC 2.95.x and awaiting stable releases, as I am working
on
production code. However, I am on this list to track development, so I know
when
to begin planning for upgrade to standard C++ (e.g. string streams). :-)
> | Why doesn't valarray use more macro shenanigans (like
_DEFINE_BINARY_OPERATOR(+,
> | plus)) to declare the operators within the class? See
bits/std_valarray.h:140
> | for details.
>
> Why should them be declared within then class? Where do you draw that
> requirement from?
I don't know about requirements. My observation is that instead of
declaring:
valarray<_Tp>& operator+= (const _Tp&);
valarray<_Tp>& operator-= (const _Tp&);
...
valarray<_Tp>& operator+= (const valarray<_Tp>&);
valarray<_Tp>& operator-= (const valarray<_Tp>&);
...
you could automate the declarations using macros, in this fashion:
#define _DECLARE_VALARRAY_AUGMENTED_ASSIGNMENT(_Op)\
valarray<_Tp>& operator##_Op##= (const _Tp&);\
valarray<_Tp>& operator##_Op##= (const valarray<_Tp>&);
_DECLARE_VALARRAY_AUGMENTED_ASSIGNMENT(+)
_DECLARE_VALARRAY_AUGMENTED_ASSIGNMENT(-)
...
This style of macro use is already employed later to actually define the
operators:
_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(+, plus)
_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(-, minus)
so I wondered why it wasn't used to declare them as well.
> | Similarly, why aren't the function objects defined using macros in the
same
> | fashion? See bits/stl_function.h:49 for details.
>
> Please, can you exapnd on this?
The function objects are declared as follows:
template <class _Tp>
struct plus : public binary_function<_Tp,_Tp,_Tp> {
_Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x +
__y; }
};
template <class _Tp>
struct minus : public binary_function<_Tp,_Tp,_Tp> {
_Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x -
__y; }
};
I wondered why macros weren't employed as in valarray, like this:
#define _DEFINE_FUNCTIONAL_ARITHMETIC_OPERATION(_Op, _Name)\
template <class _Tp>\
struct _Name : public binary_function<_Tp,_Tp,_Tp> {\
_Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x _Op
__y;
}\
};
_DEFINE_FUNCTIONAL_ARITHMETIC_OPERATION(+, plus)
_DEFINE_FUNCTIONAL_ARITHMETIC_OPERATION(-, minus)
> | P.S. Not related to libstdc++-v3, has anyone had any experience wrapping
> | functors/valarray in more OO fashion, for dynamic binding and
persistence? I've
> | been playing with that recently, and wouldn't mind comparing notes.
>
> What do call "more OO fashion" ?
I mean:
class AdaptableUnaryFunction :
public std::unary_function<std::valarray<double>,
std::valarray<double>
>
{
public:
virtual ~AdaptableUnaryFunction() = 0;
virtual result_type operator ()(const argument_type& arg) const = 0;
};
--
Marc Lepage
Software Developer
Molecular Mining Corporation
http://www.molecularmining.com/
More information about the Libstdc++
mailing list