|
Boost Users : |
From: Hicham Mouline (hicham_at_[hidden])
Date: 2008-01-28 15:55:52
Hi, thanks for your answers,
Because I had tested just with :
1. static double sum(double d1, double d2, double d3)
{
return d1+d2+d3;
}
vs
2. static double sum(double d[3])
{
return d[0]+d[1]+d[2];
}
with calls to sum() in a tight loop.
I suspect boost::array is equivalent to 2.
was some 40% faster than 2 with advanced intel optimization.
Could you elaborate on the recursive generation?
Rds,
template<class T, size N>
struct Tree
{
typedef boost::array<T, N> parameters_types;
};
From: boost-users-bounces_at_[hidden]
[mailto:boost-users-bounces_at_[hidden]] On Behalf Of Ovanes Markarian
Sent: 28 January 2008 21:27
To: boost-users_at_[hidden]
Subject: Re: [Boost-users] Template instantiation function arguments and
Boost.Preprocessor
Hi,
besides the more complex possibility to use boost::tuple and generate
recursive Tree<X> List : derived from Tree<X-1> ...: derived from Tree<0>
specialization, why not using a boost::array instead?
Here an example:
template<class T, size N>
struct Tree
{
typedef boost::array<T, N> parameters_types;
T sum(parameters_type const& p)
{
return std::accumulate(p.begin(), p.end(), 0);
}
};
This is type safe and fast ;) and your users can initialize boost array with
an initializer list like:
parameters_type x = { 1, 2, 3, 4, 5... };
Regards,
Ovanes
On Jan 28, 2008 8:26 PM, Hicham Mouline <hicham_at_[hidden]> wrote:
After some though, here is more precisely what I'd like to have...
I apologize that it is quite different from the initial problem:
template<int n> class Tree {
static double sum(); //
};
If the user instantiates tree<2>, he should get:
template<> class Tree<2> {
static double sum(double d1, double d2);
};
template<> class Tree<3> {
static double sum(double d1, double d2, double d3);
};
etc etc...
so that in user code, for e.g.:
double d= Tree<4>::sum(d1, d2, d3, d4);
should compile.
Is it possible for me to just define the template Tree for the n-case
without the 2- and 3- specializations?
Rds,
-----Original Message-----
From: boost-users-bounces_at_[hidden]
[mailto:boost-users-bounces_at_[hidden]] On Behalf Of Steven Watanabe
Sent: 28 January 2008 16:42
To: boost-users_at_[hidden]
Subject: Re: [Boost-users] Template instantiation function arguments and
Boost.Preprocessor
AMDG
Hicham Mouline wrote:
> hi,
>
> i have a template function, the arguments of which i wish to have depend
on a non-type int template argument:
>
> template<int n>
> double f<n>( double arg0, double arg1, ..., double argn ) // ... is not
the variadic notation for var number of args
> {
> // for(int i=0; i<n; i++)
> // code
> return sum;
> }
>
> int main()
> {
> return x = f<3>( 1.0, 2.0, 3.0 );
> }
>
> BOOST_PP_REPEAT can't seem to do the job as the template argument n needs
to be known
> at the preprocessing stage, which happens before the template
instantiation stage (
> this is part of compilation)
>
I don't understand why you want n to be passed explicitly. Can't it be
deduced from the
number of arguments (warning untested):
#define SUM_IMPL(z, n, data) + arg ## n
#define F_DEF(z, n, data) double f(BOOST_PP_ENUM_PARAMS_Z(z, n, double
arg)) { return(0.0 BOOST_PP_REPEAT_ ## z(n, SUM_IMPL, ~)); }
BOOST_PP_REPEAT(MAX_ARITY, F_DEF, ~)
In Christ,
Steven Watanabe
_______________________________________________
Boost-users mailing list
Boost-users_at_[hidden]
http://lists.boost.org/mailman/listinfo.cgi/boost-users
-- No virus found in this incoming message. Checked by AVG Free Edition. Version: 7.5.516 / Virus Database: 269.19.14/1247 - Release Date: 1/28/2008 10:59 AM _______________________________________________ Boost-users mailing list Boost-users_at_[hidden] http://lists.boost.org/mailman/listinfo.cgi/boost-users
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net